gpt4 book ai didi

java - 静态和非静态同步方法的并发执行有问题吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:37:57 24 4
gpt4 key购买 nike

在下面的例子中

  1. 如果不同线程尝试访问静态和非静态同步方法并发,并依次尝试使用这两种方法更改静态数据?
  2. 使用 run() 方法的 do-while 循环是否有任何问题为每个非静态创建一个 BadDesign 类的新对象同步方法调用?
  3. 此 Java 代码是否正确同步?

这是说明我的问题的示例代码:

BadDesign.java

public final class BadDesign{

private static int sensitiveData;

public synchronized static void changeDataViaStaticMethod(int a){
//... updating the sensitiveData
sensitiveData = a;
}


public synchronized void changeDataViaNonStaticMethod(int b){
//... updating the sensitiveData
sensitiveData = b;
}


public static void showSensitiveDataStatic(){
System.out.println("Static: " + Thread.currentThread().getName()+ " - " + sensitiveData);
}


public void showSensitiveData(){
System.out.println(Thread.currentThread().getName() + " - " + sensitiveData);
}


public static void main(String[] args){

new Thread(new TestThread11()).start();
new Thread(new TestThread11()).start();
}
}

和TestThread11.java

class TestThread11 implements Runnable{
public void run(){
int i = 0;

do{
BadDesign.changeDataViaStaticMethod(5);
BadDesign.showSensitiveDataStatic();

//... new object for every iteration

//... so synchronization of non-static method

//... doesn't really do anything significant here

BadDesign bd = new BadDesign();
bd.changeDataViaNonStaticMethod(10);
bd.showSensitiveData();

}while (i++ < 100);
}
}

最佳答案

非静态版本将允许两个不同的线程通过不同的对象进入,获取不同的锁并仍然访问相同的共享数据。从根本上说,这不是线程安全的,并且基本上使锁变得无用。您希望任何共享数据都被一个锁覆盖。

如果您真的愿意,您仍然可以使用非静态方法(例如,如果结果也应部分由实例数据确定),但您应该通过共享锁访问共享数据,例如

private static final Object staticLock = new Object();

...

synchronized (staticLock)
{
// Read or write static data
}

关于java - 静态和非静态同步方法的并发执行有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6894906/

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