实现线程安全机制synchronized和Lock的区别

 1、作用

        Lock 和 synchronized 都是Java中去用来解决线程安全的一个工具。

 2、本质区别

        synchronized是一个关键字,而Lock是一个接口。

 3、作用位置

        synchronized可以作用在方法和代码块上,而Lock只能作用在代码块上。synchronized作用在静态方法上锁的是当前类的class,作用在普通方法上锁的是当前类的对象。在反编译成字节码后,synchronized关键字需要有一个代码块进入的点monitorenter,代码块退出和代码块异常的出口点monitorexit。

 4、加锁方式

        synchronized是阻塞式加锁,而Lock中的trylock支持非阻塞式加锁。

 5、灵活性

        Lock锁比sychronized的灵活性更高。Lock可以自主的去决定什么时候加锁与释放锁。只需要调用Lock 的lock()和unlock()这两个方法就可以。

        sychronized 由于是一个关键字,所以他无法实现非阻塞竞争锁的方法,一个线程获取锁之后,其他锁只能等待那个线程释放之后才能有获取锁的机会。

 6、中断

        synchronized不可中断,而Lock中的lockInterruptibly可中断的获取锁。                          ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。 ReentrantLock.lock方法不允许Thread.interrupt中断,即使检测到Thread.isInterrupted,一样会继续尝试获取锁,失败则继续休眠。只是在最后获取锁成功后再把当前线程置为interrupted状态,然后再中断线程。

 7、原理

        synchronized采用的是monitor对象监视器,Lock的底层原理是AQS。

 8、队列

        synchronized只有一个同步队列和一个等待队列,而Lock有一个同步队列,可以有多个等待队列。
        同步队列:排队取锁的线程所在的队列。
        等待队列:调用 wait 方法后,线程会从同步队列转移到等待队列。

 9、公平锁与非公平锁

        synchronized是非公平锁,而Lock可以是公平锁也可以是非公平锁。

        公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。

        优点:所有的线程都能得到资源,不会饿死。

        缺点:吞吐量低,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销大。
        非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

        优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。
        缺点:可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁,最终饿死。

 10、唤醒方式

        synchronized使用的是object对象本身的wait、notify、notifyAll方法,而Lock使用的是Condition进行线程之间的调度。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jy_0301_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值