通过三级缓存解决
三级缓存中,从而解决循环依赖
IoC(Inversion of Control)意为控制反转,是一种编程思想/原则,大概意思就是将传统编程的控制流交给通用框架,达到控制反转的目的。以Java为例,A 对象使用B,需要自己先new 一个B对象,然后再使用;而IoC则是把对象的控制权交给IoC框架,需要使用时直接从框架获取即可,所以说叫控制反转;
DI(Dependency Injection)即依赖注入,可以理解为IoC概念的具体解决方式。要把对象的控制权交给框架,就要建立对象之间的依赖关系,所以依赖注入主要是用来建立对象间的依赖关系。依赖注入一般有三种方式:
-Xms:
堆内存最小值
-Xmx:
堆内存最大值(一般和-Xms
相等)
-Xss:
每个线程对应栈内存大小
-XX:MaxMetaspaceSize:
元数据内存大小
-XX:SurvivorRatio:
eden/survivor大小比例,默认为8
-XX:MaxTenuringThreshold:
进入老年代的MinorGC次数临界值,默认为15
-XX:PretenureSizeThreshold:
大对象阈值,超过这个阈值的直接分配到老年代,默认为0
ParNew + CMS收集器
java -XX:+PrintCommandLineFlags -version
例如有两个方法分别持有锁L
,R
。A线程获得L锁之后申请R锁,同时B线程获得了R锁申请L锁,
由于两个两个线程调用顺序不一致导致死锁;
这种情况需要在编码时避免多个线程以不同的顺序请求相同的锁;
线程中断主要依赖Thread类的三个方法:
interrupt()
:中断调用的线程,如果是阻塞在Object的join(),wait(),sleep()
等方法上,抛出InterruptedException异常并清除中断状态;
如果是阻塞在io相关可中断方法上,不会清除中断状态,会抛出对应异常;interrupted()
:静态方法,返回当前线程中断状态,并清除状态。所以如果调用此方法返回了true,如果不想屏蔽这个中断,最好抛出异常或者调用interrupt()
方法重新使其恢复中断状态;isInteruppted()
: 返回调用线程的中断状态,不进行任何处理;和interrupted()
方法一样都是调用了native方法:
isInterrupted(boolean ClearInterrupted)
,区别是前者使用了当前线程,并且ClearInterrupted 设置为true,即
清除中断状态,而此方法应用于调用线程,并且没有清除中断状态。首先看下ThreadPoolExecutor构造函数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler){
/*******************省略部分代码********************/
}
主要看几个参数含义:
corePoolSize
:
核心线程数,当线程池中活跃线程达到核心线程数时,新添加的任务
会添加到阻塞队列中等待执行;maximumPoolSize
:
最大线程数,当线程池中的工作线程数达到最大线程数时,执行拒绝策略;keepAliveTime
:
空闲线程活跃时间,如果当前线程数超过了corePoolSize
并且allowCoreThreadTimeOut
配置为true,当空闲线程等待时间超过了
配置的keepAliveTime
时,中断空闲的线程,否则一直等待新的任务提交;workQueue
: 阻塞队列,用以保存任务;threadFactory
: 创建线程工厂类handler
: 拒绝策略;this
溢出)Immutable对象是线程安全的,因为其状态不可变,并且只有构造函数控制;
要安全的发布一个对象,需要同时保证对象的引用和对象的状态对其他线程可见, 可以通过以下方式安全的发布:
volatile
修饰,或者保存到AtomicReference
对象中final
类型域中引用:《Java并发编程实战》
instanceof
操作符检查”参数是否为正确的类型”:
如果不是,则返回false。所谓正确的类型是指equals方法所在的类,
或者该类实现的接口。另外,instanceof
操作符的第一个参数如果是null,
则一定返回false,所以equals方法入参(例如obj)没必要进行非空判断。Java基础
8种基本数据类型,4个整型,两个浮点类型,一个字符类型,一个布尔类型;
整型:
byte:一个字节,8位;
short: 2个字节,16位;
int: 4个字节,32位;
long: 8个字节,64位;