synchronized和lock的区别

@ synchronized和lock的区别
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;

2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;

4.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可中断、可公平

5.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

6.最重要的是Lock是一个接口,而synchronized是一个关键字,synchronized放弃锁只有两种情况:①线程执行完了同步代码块的内容②发生异常;而lock不同,任何条件下都可以主动放弃锁

public void addCount() {
    synchronized (this) {
        for (int i = 0; i < 100; i++) {
            count++;
            System.out.println(Thread.currentThread().getName() + "----" + count);
        }
    }
}

我们只能等待for循环执行完,其他线程才可以再次进入for循环

private Lock lock = new ReentrantLock();
public  void addCount4() {
    lock.lock();
    for (int i = 0; i < 100; i++) {
        count++;
        if (i==50){
            lock.unlock();
        }
        System.out.println(Thread.currentThread().getName() + "----" + count);
    }
}

我们可以在for循环内部释放锁。也可以执行完for循环释放锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值