gpt4 book ai didi

java - 同步块(synchronized block)不工作

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:47 25 4
gpt4 key购买 nike

此练习直接来自 Kathy Seirra 和 Bert Bates 的 SCJP

同步代码块

在本练习中,我们将尝试同步一段代码。在该代码块中,我们将获得一个对象的锁,以便其他线程在执行该代码块时无法修改它。我们将创建三个线程,它们都将尝试操作同一个对象。每个线程将输出一个字母 100 次,然后将该字母递增 1。我们将使用的对象是 StringBuffer。

我们可以在一个字符串对象上同步,但是字符串不能被修改一次它们是创建的,因此如果不生成新的 String 对象,我们将无法增加字母。最终输出应该有 100 个 As、100 个 Bs 和 100 个 Cs 全部在连续的行中。

  1. 创建一个类并扩展 Thread 类。
  2. 重写 Thread 的 run() 方法。这是同步的地方代码块将消失。
  3. 为了让我们的三个线程对象共享同一个对象,我们需要创建在参数中接受 StringBuffer 对象的构造函数。
  4. 同步代码块将获得 StringBuffer 上的锁来自第 3 步的对象。
  5. 在 block 内,输出 StringBuffer 100 次然后递增StringBuffer 中的字母。您可以查看第 6 章中的 StringBuffer对此有帮助的方法。
  6. 最后,在 main() 方法中,使用字母 A,然后创建我们类的三个实例并启动所有这三个实例。

我为上面的练习写了下面的类(我打印 10 个字符而不是 100 个)

class MySyncBlockTest extends Thread {

StringBuffer sb;

MySyncBlockTest(StringBuffer sb) {
this.sb=sb;
}

public static void main (String args[]) {
StringBuffer sb = new StringBuffer("A");
MySyncBlockTest t1 = new MySyncBlockTest(sb);
MySyncBlockTest t2 = new MySyncBlockTest(sb);
MySyncBlockTest t3 = new MySyncBlockTest(sb);
t1.start();
t2.start();
t3.start();
}

public void run() {
synchronized(this) {
for (int i=0; i<10; i++) {
System.out.print(sb);
}
System.out.println("");
if (sb.charAt(0)=='A')
sb.setCharAt(0, 'B');
else
sb.setCharAt(0, 'C');
}
}
}

我期望得到如下所示的输出(10 As、10 Bs 和 10 Cs),但没有得到。

AAAAAAAAAA
BBBBBBBBBB
CCCCCCCCCC

相反,我得到了如下所示的不同输出,因为三个线程是有机会在对方完成之前进入循环。

AAAAAAAAAAAAAAAAAA
ABB
ACCCCCCCC

我的问题是为什么 run 方法中的 synchronized block 不起作用?

最佳答案

4. The synchronized block of code will obtain a lock on the StringBuffer object from step 3.

好吧,你不会那样做吧?

synchronized(this) {

您正在获取调用 run() 方法的 MySyncBlockTest 实例的锁。那...不会做任何事情。没有对该资源的争用;每个 Thread 都有自己的 MySyncBlockTest 实例。

关于java - 同步块(synchronized block)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18029698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com