Java同步机制
线程同步就是让多个线程按照一定的顺序有序执行。
JVM提供的synchronized
JDK提供的ReentrantLock
(1)选择与对比
性能差不多,除非要使用ReentrantLock的高级功能否则首选synchronized。
ReentrantLock不是所有JDK版本都支持。
因为sync是JVM支持的,而且不用担心没有释放锁而导致的死锁问题。
(2)具体特性分析
1. synchronized
1> 同步一个代码块
同步一个代码块时,作用于同一个对象。两个线程调用同一个对象的同步代码块,这时两个线程就会同步,一个线程进入同步代码块时,另一个线程就会等待。
如果两个线程作用于不同的对象的同步代码,两个线程不需要同步。会进行交叉执行。
2> 同步一个方法
与同步一个代码块作用相同。
3> 同步一个类
同步于一个类时,两个线程作用于不同对象的同步语句,这时两个线程也会进行同步。
4> 同步一个静态方法
和作用于一个类相同。
2. ReentrantLock
等待可中断,当持有锁的线程长期不释放锁的时候,正在等待的线程可以放弃等待,改为处理其他事情。
锁绑定多个条件
ReentrantLock可以同时绑定多个Condition对象。
JVM提供的synchronized
JDK提供的ReentrantLock
(1)选择与对比
性能差不多,除非要使用ReentrantLock的高级功能否则首选synchronized。
ReentrantLock不是所有JDK版本都支持。
因为sync是JVM支持的,而且不用担心没有释放锁而导致的死锁问题。
(2)具体特性分析
1. synchronized
1> 同步一个代码块
同步一个代码块时,作用于同一个对象。两个线程调用同一个对象的同步代码块,这时两个线程就会同步,一个线程进入同步代码块时,另一个线程就会等待。
如果两个线程作用于不同的对象的同步代码,两个线程不需要同步。会进行交叉执行。
2> 同步一个方法
与同步一个代码块作用相同。
3> 同步一个类
同步于一个类时,两个线程作用于不同对象的同步语句,这时两个线程也会进行同步。
4> 同步一个静态方法
和作用于一个类相同。
2. ReentrantLock
等待可中断,当持有锁的线程长期不释放锁的时候,正在等待的线程可以放弃等待,改为处理其他事情。
锁绑定多个条件
ReentrantLock可以同时绑定多个Condition对象。