【问题标题】:What is synchronized statement used for?同步语句是做什么用的?
【发布时间】:2009-08-12 18:50:24
【问题描述】:

synchronized 语句的用途是什么?

【问题讨论】:

  • 您想要语法还是想知道为什么以及何时使用它?
  • stackoverflow.com/users/124339/johanna所有“什么是..”问题是怎么回事?
  • -1 你一直在问一个在每个教程中都可以轻松回答的问题,甚至设法获得了相当大的声誉。我认为这不诚实。
  • @tkopec:实际上,这个网站的常见问题解答鼓励了它,如果问题是独一无二的,并且在 SO 中产生了良好的信息,它们就会使网站受益——这就是为什么问题与它们相关联的原因。这些信息都在常见问题解答中。
  • @Software Monkey - 当您查看她的个人资料时,您会发现她最近相当气馁:stackoverflow.com/questions/1035151/… stackoverflow.com/questions/1035134/… stackoverflow.com/questions/1264706/… 而主题有争议的@987654325 @

标签: java synchronization


【解决方案1】:

这些用于构建具有许多“线程”的程序。当 main 启动时,它从一个线程开始,该线程按顺序执行步骤。您可以启动更多线程,然后这些线程可以同时执行代码。如果您同时执行相同的代码,事情可能会以您不希望的方式运行:

y = x+20;
// at this moment, before the next instruction starts, some other thread performs 
// the above step, which sets 'y' (an object property) to something different.
int b = y+10; // this would not be x+20, as you might expect.

您要做的是在这段代码上加一个“锁”,以确保没有其他线程可以开始执行任何“同步”变量 y 的代码。

synchronized (y) {
    y = x+20;
    int b = y+10;
} // lock gets released here

现在,所有其他线程都必须等待首先到达那里的线程退出块并释放锁,此时另一个线程获取锁,进入代码块,执行它并释放锁。请注意,y 必须是对象(整数),而不是原始类型。

您还可以将“同步”添加到方法中,该方法在“this”(实例对象)或静态方法情况下的类上同步。

由于这样的问题,编写多线程代码很困难。同步是一种工具,尽管它有一个主要问题——死锁。网上有很多关于死锁的资料。

【讨论】:

    【解决方案2】:

    调用对象的同步实例方法获取对象的锁,调用类的同步静态方法获取类的锁。当执行方法中的代码块时,同步语句可用于获取任何对象的锁,而不仅仅是此对象。这个块被称为同步块。同步语句的一般形式如下: synchronized (expr) { statements; } 表达式 expr 必须计算为对象引用。如果对象已被另一个线程锁定,则该线程将被阻塞,直到锁定被释放。当在对象上获得锁时,执行同步块中的语句,然后释放锁。

    【讨论】:

      【解决方案3】:

      它是一个以互斥形式构建的java。这用于多线程应用程序。

      Sun concurrency tutorial

      这有一个关于同步的部分,但如果你尝试使用多线程应用程序,你应该阅读整个内容。

      Wiki mutex

      【讨论】:

        【解决方案4】:

        一次只有 1 个线程可以访问同步块。

        这是一种基本的语言结构。如果您对它完全不熟悉,则需要复习。

        【讨论】:

          【解决方案5】:

          它创建了一段代码,对于两个或多个线程,可以 (a) 一次只能由一个线程执行,并且 (b) 形成一个内存屏障

          虽然理解防止代码并发执行的互斥概念很容易,但内存屏障同样重要。

          内存屏障在两个线程之间形成“发生在之前”的关系。一个线程在获取锁之前对内存所做的任何更改都保证在另一个线程获取相同的锁之后被另一个线程观察到。由于 CPU 缓存的影响及其与主内存的交互,这对于防止观察和更新陈旧的缓存内存以及防止线程之间的竞争条件至关重要。

          【讨论】:

          • +1 对其他线程的可见性的重要性经常被忽视
          猜你喜欢
          • 2011-04-18
          • 2011-02-14
          • 2014-11-01
          • 2013-11-29
          • 2019-03-21
          • 2021-09-04
          • 2010-11-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多