所以在Java中,我知道你可以使用对象的所谓“固有锁定”来创建互斥区域,并确保内存可见性。 Java使得它特别容易隐含在this
对象的一些语法糖的内部锁锁,如:在Java中使用Thread对象的内部锁定可以吗?
public class Foo{
public synchronized doFoo(){
//doFoo is executed in an implicit synchronized block
//on the 'this' object
}
}
这是可以理解和接受的做法看守许多对象的成员字段。我不知道是当锁定的对象是Thread
对象时,上述情况是否正常。例如,是否有任何理由避免以下情况?
public class Bar extends Thread{ //notice the 'extends Thread' here
public synchronized doBar(){
//doBar is executed in an implicit synchronized block
//on the 'this' object
}
}
现在,我要坚持我所知道的是更安全的东西,如:
public class Baz extends Thread{ //notice the 'extends Thread' here
private final Object explicitLockObject = new Object();
public doBaz(){
synchronized(explicitLockObject){
//doBaz impl
}
}
}
我的问题将得到双重使用选项#2(Bar
为例):
- 是否有关于上可能与这样的锁定策略冲突的主题本身同步现有JVM代码或Java约定?
- 锁定
this
通常意味着该对象的访问应始终由该对象的内部锁保护。在Bar
线程的情况下,这意味着我们暗示只要您触摸Bar
线程,就应该在实例上进行同步。这似乎可能导致一些其他线程不必要地(甚至危险地)阻塞,直到Bar
完成/退出。
以上是有效的担忧吗?我觉得我需要这样一个布赖恩戈茨灯塔:-)
1.嗯,有一个惯例,你不应该首先扩展'Thread':实现一个'Runnable',将它作为构造函数参数传递给'Thread'(参见[this question](http ://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread))。现在,你会关心在'Runnable'上同步吗? –
是的,我知道那个约定。说实话,这本来不是我的代码,我也不打算重构。我知道'Runnable'会很好,因为它没有州行李。可惜!这不是我所拥有的,我很想知道这个答案。 – codeCogs
我建议开发人员更喜欢并发包中的新类,而不要使用原始线程。多线程代码很难编写。 – duffymo