synchronized 和lock的区别
- synchronized 自动解锁,lock需要手动(死锁)
- synchronized 是java关键字,lock是接口
- synchronized 无法判断是否获取锁,lock可以通过trylock来判断
- synchronized 要求一直等待,lock可以设置响应中断锁,来停止等待
- synchronized 非公平锁,可插队,lock 自行选择是公平还是非公平
- synchronized 适用于少量同步问题,lock 适用于大量同步
- synchronized 悲观锁,lock 乐观锁
- synchronized 可重入,不可判断,非公平,不可中断 ;
- lock 可重入,可判断,中断和公平与否都可以进行设置
Lock 实现生产消费问题
- 通过lock 手动上锁,解锁
- 通过condition 代替object的监视器方法( wait , notify和notifyAll )
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test2 {
public static void main(String[] args) {
Data2 date = new Data2();
//此处省略多线程启动,代码与上面相同
}
class Data2{
private int number=0;
private Lock lock=new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment() throws InterruptedException {
lock.lock();
try{
while (number!=0)
condition.await();//代替wait
number++;
System.out.println(Thread.currentThread().getName()+" incr->"+number);
condition.signal();//代替notify
}catch (Exception exception){
System.err.println("incr wrong");;
}finally {
lock.unlock();
}
}
public void decrement()throws InterruptedException{
lock.lock();
try {
while ( number==0)
condition.await();
number--;
System.out.println(Thread.currentThread().getName()+" decr->"+number);
condition.signal();
}catch (Exception ex){
System.err.println("decr wrong");
}finally {
lock.unlock();
}
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)