gpt4 book ai didi

java - 线程 : Synchronized Block

转载 作者:行者123 更新时间:2023-11-29 10:17:06 24 4
gpt4 key购买 nike

我对同步块(synchronized block)有疑问。执行下面的代码后,我得到输出为:

Inside run=>thread 2
Inside run=>thread 1
Inside run=>thread 1
Inside run=>thread 2
Inside run=>thread 2
Inside run=>thread 1
Inside run=>thread 2
Inside run=>thread 1
Inside run=>thread 1
Inside run=>thread 2

我期待输出,因为只有一个线程会首先执行同步块(synchronized block),然后只有第二个线程才能访问同步块(synchronized block)。可能是我理解错了这个概念?

 package com.blt;

public class ThreadExample implements Runnable {
public static void main(String args[])
{


System.out.println("A");
Thread T=new Thread(new ThreadExample());
Thread T1=new Thread(new ThreadExample());
System.out.println("B");
T.setName("thread 1");
T1.setName("thread 2");
System.out.println("C");
T.start();
System.out.println("D");
T1.start();
}


synchronized public void run()
{
for(int i=0; i<5; i++)
{
try
{
System.out.println("Inside run=>"+Thread.currentThread().getName());
Thread.currentThread().sleep(2000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}

最佳答案

您的每个线程都在不同的对象上进行同步。所以是的,他们不会将彼此拒之门外。但更重要的是,run 方法是为 Runnable 接口(interface)定义的,没有同步修饰符,您不应该向其中添加一个(正如您已经看到的,它没有达到您预期的效果)。

要记住的关键是,当您在方法上使用同步修饰符时:

public synchronized void someMethod();

这与使用synchronized(this) 实际上是一样的。在这两种情况下,您都锁定在对象监视器上。如果您有多个对象,则您有多个监视器。

这是您自己的示例的修改版本,它将像您预期的那样工作。它使用一个公共(public)对象监视器(在这种情况下,您的类本身),以便同步按预期工作:

public class ThreadExample implements Runnable {
public static void main(String args[]) {
System.out.println("A");
Thread T = new Thread(new ThreadExample());
Thread T1 = new Thread(new ThreadExample());
System.out.println("B");
T.setName("thread 1");
T1.setName("thread 2");
System.out.println("C");
T.start();
System.out.println("D");
T1.start();
}

public void run() {
synchronized (ThreadExample.class) {
for (int i = 0; i < 5; i++) {
try {
System.out.println("Inside run=>"
+ Thread.currentThread().getName());
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

关于java - 线程 : Synchronized Block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14809990/

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