当多个线程访问一个对象时,若是不用考虑这些线程在运行时环境下的调度和交替执行,也不须要考虑额外的同步,或者在调用方进行任何其余协调操做,调用这个对象的行为均可以得到正确的结果,这个对象就是线程安全的。安全
无论运行时环境如何,调用者都不须要任何额外的同步措施。bash
Java API标注是线程安全的通常都不是绝对线程安全。多线程
Vector,HashTable ,Collections的SynchronizedCollection()方法并发
对象自己不是线程安全的,可是能够经过调用端正确地使用同步手段,能够保证在并发环境下安全的使用。ArrayList等优化
不管是否使用同步手段,多线程环境下都不可以使用。spa
System.setIn(),System.setOut()线程
互斥是方法,同步是目的。3d
synchronized关键字,编译后会生产moniterenter和moniterexit两个指令码。code
ReentrantLockcdn
优先使用synchronized
CAS操做 sun.misc.Unsafe类的compareAndSwapInt(),compareAndSwapLong()
有ABA问题,能够用时间戳,version
可重入代码(幂等): 输入一样的数据,返回的结果都相同。
线程本地存储(只有一个线程使用)
一段代码的数据不与其余共享
自旋锁 “让等待锁的线程稍等一下”,执行一个忙循环,默认执行10次。
经过参数-XX:PreBlockSpin来更改。
自适应自旋锁:自旋时间不固定,由上一次在同一个锁上的自旋等待时间及锁的持有者状态来肯定。
依托逃逸分析的数据支持,例如线程私有的部分会去掉同步锁。
public void a(){
while(i>0){
synchronized{// 每次循环都加锁,好烦系统资源。
do something();
i++
}
}
}
//JVM自动优化为:
public void a(){
synchronized{// 粗化仅仅加一次锁
while(i>0){
do something();
i++
}
}
}
复制代码
消除无数据竞争状况下的同步原语。
这个锁会偏向第一个获取它的线程。该锁没有被其余线程获取,持有偏向锁的线程不须要进行同步。
基于Mark Word的CMS进行。
2个以上线程竞争同一个锁,会膨胀为重量级锁。
更多详情页,请访问: juntech.top