首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程
在JAVA中,内置锁都是可重入的,也就是说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器将会递减,当计数值等于0时,锁释放。
看例子,一目了然:
new Thread() { /* (non-Javadoc) * @see java.lang.Thread#run() */ @Override public void run() { // 第一次获得锁 synchronized(this) { while(true) { // 第二次获得同样的锁 synchronized(this) { System.out.println("ReteenLock!"); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }}.start();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
如果没有可重入锁的支持,在第二次企图获得锁时将会进入死锁状态。在实际的代码中,我们可能不会这么写代码,但是可重入锁依旧随处可见,如下:
public class PartBuilder { public synchronized void buildPart_1() { } public synchronized void buildPart_2() { } /** * 很明显的可重入锁用法 */ public synchronized void buildPart() { this.buildPart_1(); this.buildPart_2(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
在上面的例子中,进入buildPart()方法时已经获取了对象锁,在调用buildPart_1()时又再次获取对象锁,此时对象的锁计数值已经达到2了。
结论
JAVA的可重入锁提升了加锁行为的封装性,大大简化了面向对象并发代码开发的难度。