论坛首页 Java企业应用论坛

同一任务和对象锁的问题

浏览 13708 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (9) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-04   最后修改:2010-08-04
mercyblitz 写道
hardPass 写道
对于单线程来说,synchronized锁是可重入的


重进入是针对多线程的,单线程synchronized还有什么意义?



说实话,我到现在为止,也没有明白,我们常说的 可重入锁 是什么意思?

这个 “重”是指 “多个线程”同时进入同1个锁?这个类似 readLock
还是指 单个线程 同时进入“多个”被“锁”住的代码块? 这个类似synchronized,如果硬要咬文嚼字,这里确实不应该说是“可重入”,
用其他词,好像也不够酷。








0 请登录后投票
   发表时间:2010-08-04  
beneo 写道
看了半天原来对象锁是monitor,妈的翻译害死人



Java 1.5以后的Lock实现,确实可以带来一定帮助。较前面的synchronized而言,synchronized可以监视多个monitor对象,当monitor对象释放锁顺序不正确,会发生死锁。而Lock对象,monitor是其本身,相对而言,更容易检测。
0 请登录后投票
   发表时间:2010-08-04   最后修改:2010-08-04
hardPass 写道
mercyblitz 写道
hardPass 写道
对于单线程来说,synchronized锁是可重入的


重进入是针对多线程的,单线程synchronized还有什么意义?



说实话,我到现在为止,也没有明白,我们常说的 可重入锁 是什么意思?

这个 “重”是指 “多个线程”同时进入同1个锁?这个类似 readLock
还是指 单个线程 同时进入“多个”被“锁”住的代码块? 这个类似synchronized,如果硬要咬文嚼字,这里确实不应该说是“可重入”,
用其他词,好像也不够酷。


”可重入“很形象的,好比方法的递归。如果一个线程获得锁之后,我们常说的synchronized块下的代码块就是临界区,在这个临界区内部所有的方法调用都是同步的。这点不难明白,但是块中方法调用还有synchronized修饰的块或者方法,哪么线程不需要重复获得锁。简单地说,如果一个线程第一次进入了synchronized块,接下来的动作中,线程再次进入synchronized块不会重复获得锁。
0 请登录后投票
   发表时间:2010-08-04  
michael.softtech 写道

我是这样理解的。 Java Monitors Are Reentrant 也就是当前线程如果已经有了一个Object a的锁,那么此线程想再次获取这个a的锁时,可以继续获取。然后在此线程对于该锁的计数上+1. 比如

 

synchronized  m1(){
//加入此时对锁a的计数是N
 m2();  //进入m2的方法体之后锁计数是N+1,离开m2后是N
}
synchronized m2(){}

 这样就能保证锁的正确获取和释放了。

 

 个人理解,仅供参考~

说的没错。我在《java concurrency in practice》一书里得到了验证:

《java concurrency in practice》: 写道
2.3.2. Reentrancy
When a thread requests a lock that is already held by another thread, the requesting thread blocks. But because intrinsic locks are reentrant, if a thread tries to acquire a lock that it already holds, the request succeeds. Reentrancy means that locks are acquired on a per-thread rather than per-invocation basis. [7] Reentrancy is implemented by associating with each lock an acquisition count and an owning thread. When the count is zero, the lock is considered unheld. When a thread acquires a previously unheld lock, the JVM records the owner and sets the acquisition count to one. If that same thread acquires the lock again, the count is incremented, and when the owning thread exits the synchronized block, the count is decremented. When the count reaches zero, the lock is released.
 
0 请登录后投票
   发表时间:2010-08-04  
可重入锁ReentrantLock是使用计数器变量,notify  wait实现的。
synchronized没有计数器的概念。
0 请登录后投票
   发表时间:2010-08-04  
没有再次持有吧,调用同步方法必须持有此对象锁,而此对象锁已经持有了.
0 请登录后投票
   发表时间:2010-08-04   最后修改:2010-08-04
多次获取同一对象的锁后,释放的时候也是要释放多次??还是一次释放掉所有的对象锁??
0 请登录后投票
   发表时间:2010-08-04  
lxs647 写道
多次获取同一对象的锁后,释放的时候也是要释放多次??还是一次释放掉所有的对象锁??



只有一个锁,这个锁是线程所有,并不是monitor对象。只会释放一次。
0 请登录后投票
   发表时间:2010-08-04  
mercyblitz 写道
hardPass 写道
mercyblitz 写道
hardPass 写道
对于单线程来说,synchronized锁是可重入的


重进入是针对多线程的,单线程synchronized还有什么意义?



说实话,我到现在为止,也没有明白,我们常说的 可重入锁 是什么意思?

这个 “重”是指 “多个线程”同时进入同1个锁?这个类似 readLock
还是指 单个线程 同时进入“多个”被“锁”住的代码块? 这个类似synchronized,如果硬要咬文嚼字,这里确实不应该说是“可重入”,
用其他词,好像也不够酷。


”可重入“很形象的,好比方法的递归。如果一个线程获得锁之后,我们常说的synchronized块下的代码块就是临界区,在这个临界区内部所有的方法调用都是同步的。这点不难明白,但是块中方法调用还有synchronized修饰的块或者方法,哪么线程不需要重复获得锁。简单地说,如果一个线程第一次进入了synchronized块,接下来的动作中,线程再次进入synchronized块不会重复获得锁。


正解!
0 请登录后投票
   发表时间:2010-08-04  
我不得不 说一句  

这里的f1调用f2是同一把锁吧   在加锁的f1中调用f2   这把锁根本就未曾释放过  知道运行完  也就是当count<0为止
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics