传递给synchronized的参数的意义是什么?
synchronized ( parameter )
{
}
以实现块级同步。我在某个地方看到了这样的代码
class test
{
public static final int lock =1;
...
synchronized(lock){
...
}
}
我不明白这段代码的目的。
谁能给我举个更好的例子和/或解释一下?
发布于 2009-05-17 18:43:25
它是锁定的引用。基本上,两个线程不会同时执行使用相同引用同步的代码块。正如Cletus所说,同步方法在很大程度上等同于在方法中使用synchronized (this)
。
我非常希望您看到的示例代码不是这样的-您正在尝试在一个原始变量上进行同步。同步只适用于监视器(通过引用)-即使它是合法代码,x
也会被装箱,这将导致一些非常奇怪的行为,因为一些整数总是被装箱到相同的引用,而其他整数将在每次装箱时创建一个新对象。幸运的是,Java编译器意识到这是一个非常糟糕的想法,并将为您发布的代码提供一个编译时错误。
更合理的代码是:
class Test
{
private static final Object lock = new Object();
...
synchronized(lock){
...
}
}
我已经将锁设置为私有,并将其类型更改为Object
。它是否应该是静态的取决于具体情况-基本上,如果您想要从多个线程访问/更改静态数据,通常使用静态变量;当您想要从多个线程访问/更改每个实例的数据时,通常使用实例变量作为锁。
发布于 2009-05-17 18:37:57
这一点:
public synchronized void blah() {
// do stuff
}
在语义上等价于:
public void blah() {
synchronized (this) {
// do stuff
}
}
有些人不喜欢使用'this‘进行同步,部分原因是它是公共的(因为实例对外部代码是可见的)。这就是为什么你最终会遇到使用私有锁的人:
public class Foo
private final static String LOCK = new String("LOCK");
public void blah() {
synchronized (LOCK) {
// do stuff
}
}
}
好处是锁在类之外不可见,而且您可以创建多个锁来处理更细粒度的锁定情况。
发布于 2009-05-17 18:41:13
synchronized
语句的目的是确保在多线程应用程序中,在给定时间只有一个线程可以访问关键数据结构。
例如,如果您让两个线程同时更改相同的数据结构,数据结构将被破坏,那么您通常会使用锁来保护它。
在现实世界中,考虑一个类比,其中一个公共厕所有一把钥匙,挂在一个中心位置。在你可以使用厕所之前,你需要钥匙,不仅是为了进入,也是为了保证没有其他人会在同一时间试图进入同一个厕所。他们将不得不等待密钥可用。
这就是这种锁构造的工作方式。
在本例中,synchronized
关键字的参数是关键字。你锁定钥匙,做你需要做的事情,然后你解锁钥匙,让其他人可以访问它。如果其他线程试图在密钥当前被另一个线程锁定时将其锁定,则该线程将不得不等待。
https://stackoverflow.com/questions/875175
复制相似问题