synchornized与lock区别

关于syschornized和lock区别:

       synchornized是JVM的内置锁,而lock是java代码实现的。lock是对sync的拓展,lock完全可以替代synchornized。lock允许重入,允许同一个线程连续多次获得同一把锁。       syschornized是java的一个关键字,也就是说是java语言的内置特性。

       如果一个代码块被synchornized修饰,当一个线程获取了对应的锁,并执行代码块的时候,其他线程只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁或有两种情况:1:获取锁的线程执行完了该代码块,然后线程释放对锁的占有。2:线程执行发生异常,此时JVM会让线程自动释放锁。

       如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞,但是又没有释放锁,其他线程只能等待,但是这样非常影响效率。因此需要一种机制不让等待的线程一直无期限地等待下去(比如只等待一定时间或者能够响应中断),通过Lock就可以办到。

       当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突,读操作和读操作不会发生冲突现象。但是synchornized关键字来实现同步的话,就会导致一个问题,如果多个线程知识进行读操作,当一个线程进行读操作时,其他线程只能等待,无法进行读操作。因此就需要一种机制来使得多个线程都只是进行读操作,线程之间不会发生冲突,通过Lock就可以办到。

Lock不是java内置的,synchornized是java语言的关键字,因此是内置特性,lock是一个类,通过这个类可以实现同步访问。

lock和synchornized有一点非常大的不同,采用synchronized不需要用户手动的去释放锁,当synchornized方法或者代码块执行完之后,系统会自动的让线程释放锁的占有,而lock则必须要用户手动释放锁,如果没有主动释放锁,就会导致出现死锁现象。

LOCK 是一个接口,lock接口每个方法的使用lock() tryLock() tryLock(long time,TimeUnit unit)、lockInterruptibly() 是用来获取锁的,unlock()方法就是释放锁的。

  1. lock()方法时平常使用的最多的一个方法,就是用来获取锁的,如果锁的已经被其他线程获取,则进行等待。由于在前面讲如果采用lock,必须要主动释放锁,并且在发生异常的时候,不会自动释放锁。因此一般意义上讲,使用lock必须在try catch块中进行,并且释放锁的操作在finally块中进行,以保证锁一定被释放掉,防止死锁的发生。
  2. tryLock() 方法是有返回值的,他表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已经被其他线程获取),则返回false,也就是说这个方法无论如何都会立即返回。在拿不到锁时不会一直在哪里等待。
  3. tryLock(long time,TimeUnit unit)方法和trylock() 方法时类似的,只不过区别是在与这个方法拿不到锁时会等待一段时间,在时间限制之内如果还是拿不到锁,就返回false。如果一开始就拿到锁或者在等待期间内拿到锁,则就返回true。
  4. lockinterruptibly()方法比较特殊,当通过这个方法区获取锁时,如果线程正在等待获取锁,则这个线程能够相应中断,即中断线程的等待状态。也就是说,当两个线程同时通过lock.lockinterruputibly()向获取某个锁时,假如此时线程A获取到了锁,而线程B只有等待,那么对线程调用threadB.interrupt()方法能够中断线程B的等待过程。

当一个线程获取锁之后,是不是会被interrupt()方法中断的,因此当通过lockinterruptibly() 方法获取某个锁时,如果不能获取到,只有进行等待的情况下,可以相应中断。而synchornized修饰的话,当一个线程处于等待某个锁的状态,是无法被终端的,只有只等待下去。

知识点:

1、lock是一个接口,而synchornized是java关键字,synchornized是内置的语言实现。2、synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而lock在发生异常的时候,如果没有主动释放锁unlock() ,很可能会造死锁索现象,因此使用lock() 后需要在finally中释放锁。

3、lock可以让等待锁的线程相应中断,而synchornized却不行,使用synchornized时,等待的线程会一直等待下去,不会相应中断。

4、通过lock可以知道有没有成功获取锁,而synchornized却无法办到。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值