JUC-01 synchronized&lock&condition

synchronized 和lock的区别

  1. synchronized 自动解锁,lock需要手动(死锁)
  2. synchronized 是java关键字,lock是接口
  3. synchronized 无法判断是否获取锁,lock可以通过trylock来判断
  4. synchronized 要求一直等待,lock可以设置响应中断锁,来停止等待
  5. synchronized 非公平锁,可插队,lock 自行选择是公平还是非公平
  6. synchronized 适用于少量同步问题,lock 适用于大量同步
  7. synchronized 悲观锁,lock 乐观锁
  • synchronized 可重入,不可判断,非公平,不可中断 ;
  • lock 可重入,可判断,中断和公平与否都可以进行设置

Lock 实现生产消费问题

  1. 通过lock 手动上锁,解锁
  2. 通过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
喜欢就支持一下吧
点赞0 分享