首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >块级同步

块级同步
EN

Stack Overflow用户
提问于 2009-05-17 18:35:27
回答 5查看 11.9K关注 0票数 10

传递给synchronized的参数的意义是什么?

代码语言:javascript
运行
复制
synchronized ( parameter )
{

}

以实现块级同步。我在某个地方看到了这样的代码

代码语言:javascript
运行
复制
class test
{
    public static final int lock =1;

    ...

    synchronized(lock){
       ...
    }
}

我不明白这段代码的目的。

谁能给我举个更好的例子和/或解释一下?

EN

回答 5

Stack Overflow用户

发布于 2009-05-17 18:43:25

它是锁定的引用。基本上,两个线程不会同时执行使用相同引用同步的代码块。正如Cletus所说,同步方法在很大程度上等同于在方法中使用synchronized (this)

我非常希望您看到的示例代码不是这样的-您正在尝试在一个原始变量上进行同步。同步只适用于监视器(通过引用)-即使它是合法代码,x也会被装箱,这将导致一些非常奇怪的行为,因为一些整数总是被装箱到相同的引用,而其他整数将在每次装箱时创建一个新对象。幸运的是,Java编译器意识到这是一个非常糟糕的想法,并将为您发布的代码提供一个编译时错误。

更合理的代码是:

代码语言:javascript
运行
复制
class Test
{
    private static final Object lock = new Object();

    ...

    synchronized(lock){
       ...
    }
}

我已经将锁设置为私有,并将其类型更改为Object。它是否应该是静态的取决于具体情况-基本上,如果您想要从多个线程访问/更改静态数据,通常使用静态变量;当您想要从多个线程访问/更改每个实例的数据时,通常使用实例变量作为锁。

票数 14
EN

Stack Overflow用户

发布于 2009-05-17 18:37:57

这一点:

代码语言:javascript
运行
复制
public synchronized void blah() {
  // do stuff
}

在语义上等价于:

代码语言:javascript
运行
复制
public void blah() {
  synchronized (this) {
    // do stuff
  }
}

有些人不喜欢使用'this‘进行同步,部分原因是它是公共的(因为实例对外部代码是可见的)。这就是为什么你最终会遇到使用私有锁的人:

代码语言:javascript
运行
复制
public class Foo
  private final static String LOCK = new String("LOCK");

  public void blah() {
    synchronized (LOCK) {
      // do stuff
    }
  }
}

好处是锁在类之外不可见,而且您可以创建多个锁来处理更细粒度的锁定情况。

票数 10
EN

Stack Overflow用户

发布于 2009-05-17 18:41:13

synchronized语句的目的是确保在多线程应用程序中,在给定时间只有一个线程可以访问关键数据结构。

例如,如果您让两个线程同时更改相同的数据结构,数据结构将被破坏,那么您通常会使用锁来保护它。

在现实世界中,考虑一个类比,其中一个公共厕所有一把钥匙,挂在一个中心位置。在你可以使用厕所之前,你需要钥匙,不仅是为了进入,也是为了保证没有其他人会在同一时间试图进入同一个厕所。他们将不得不等待密钥可用。

这就是这种锁构造的工作方式。

在本例中,synchronized关键字的参数是关键字。你锁定钥匙,做你需要做的事情,然后你解锁钥匙,让其他人可以访问它。如果其他线程试图在密钥当前被另一个线程锁定时将其锁定,则该线程将不得不等待。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/875175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档