Lock详细解析

一.synchronized的缺陷

  synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为何会出现Lock呢?java

  在上面一篇文章中,咱们了解到若是一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其余线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种状况:spa

  1)获取锁的线程执行完了该代码块,而后线程释放对锁的占有;线程

  2)线程执行发生异常,此时JVM会让线程自动释放锁。同步

  那么若是这个获取锁的线程因为要等待IO或者其余缘由(好比调用sleep方法)被阻塞了,可是又没有释放锁,其余线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。效率

  所以就须要有一种机制能够不让等待的线程一直无期限地等待下去(好比只等待必定的时间或者可以响应中断),经过Lock就能够办到。程序

  再举个例子:当有多个线程读写文件时,读操做和写操做会发生冲突现象,写操做和写操做会发生冲突现象,可是读操做和读操做不会发生冲突现象。方法

  可是采用synchronized关键字来实现同步的话,就会致使一个问题:总结

  若是多个线程都只是进行读操做,因此当一个线程在进行读操做时,其余线程只能等待没法进行读操做。异常

  所以就须要一种机制来使得多个线程都只是进行读操做时,线程之间不会发生冲突,经过Lock就能够办到。语言

  另外,经过Lock能够知道线程有没有成功获取到锁。这个是synchronized没法办到的。

  总结一下,也就是说Lock提供了比synchronized更多的功能。可是要注意如下几点:

  1)Lock不是Java语言内置的,synchronized是Java语言的关键字,所以是内置特性。Lock是一个类,经过这个类能够实现同步访问;

  2)Lock和synchronized有一点很是大的不一样,采用synchronized不须要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完以后,系统会自动让线程释放对锁的占用;而Lock则必需要用户去手动释放锁,若是没有主动释放锁,就有可能致使出现死锁现象。

相关文章
相关标签/搜索