synchronized 和 lock 的区别

先谈sleep与wait:
sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运 行状态。另外,在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对 象锁定池准备获取对象锁进入运行状态。

http://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html
这个样例,两个线程都使用同一个锁,就算Thread2执行了notify()方法后再对自身执行sleep()可以看到Thread1没有进行下去,而是等sleep()完了以后继续执行Thread2后续代码。可以知道sleep方法没有释放锁。


引用:https://www.cnblogs.com/dolphin0520/p/3923167.html

synchronized的缺陷:
如果这个获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待

总之:
synchronized是java中的一个关键字,Lock是一个类,通过这个类可以实现同步访问(java.util.concurrent.locks)。

lock可以让等待锁的线程响应中断(try,catch,finally),而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断。

synchronized方法或者代码块执行完后系统会自动让线程释放对锁的占用,而Lock则必须要用户去手动释放锁。

扫描二维码关注公众号,回复: 3511389 查看本文章

猜你喜欢

转载自www.cnblogs.com/LinsenLi/p/9765805.html