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则必需要用户去手动释放锁,若是没有主动释放锁,就有可能致使出现死锁现象。