gpt4 book ai didi

java - Java并发同步问题

转载 作者:行者123 更新时间:2023-12-03 12:59:10 25 4
gpt4 key购买 nike

任何人都可以解释为什么以下代码会在我使该方法同步但导致对象级别锁定时导致竞争条件的原因,我正在深入研究Java并发性。
请解释一下,因为如果我使用类级别,它肯定会起作用,我怀疑线程所占用的锁对于每个线程都是不同的。

/**
*
*/
package lession2.shared.object;

/**
* @author so_what
*
*/

class SharedClass {
private static int sharedData;

public synchronized int getSharedData() {
return sharedData;
}

public synchronized void setSharedData(int sharedData) {

SharedClass.sharedData = sharedData;
}

}

//output of the program should be the distinct numbers
public class StaleDataExample extends Thread {
static SharedClass s1=new SharedClass();
static int counter=0;
public static void main(String args[]) throws InterruptedException {

StaleDataExample t1=new StaleDataExample();
StaleDataExample t2=new StaleDataExample();
StaleDataExample t3=new StaleDataExample();
StaleDataExample t4=new StaleDataExample();
StaleDataExample t5=new StaleDataExample();
StaleDataExample t6=new StaleDataExample();
t1.start();
t2.start();
t3.start();
t4.start();

t5.start();
t6.start();
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
t6.join();
System.out.println();

}
public void run()
{

s1.setSharedData(s1.getSharedData()+1); //read->modify->write operation
System.out.print(s1.getSharedData()+" ");
}

}

最佳答案

这里的问题是您没有以原子方式(例如同步方式)增加共享值。

让我们检查以下行:

s1.setSharedData(s1.getSharedData()+1)

首先,您调用 getSharedData,即 synchronized. You then increment the value, at call setSharedData`来设置新值。问题在于该程序可能会在get和set之间进行上下文切换。考虑以下示例:
  • 线程#1调用getSharedData(),并获得0
  • 线程#2调用getSharedData(),并且也获得0
  • 线程#1的值加1,然后调用setSharedData(1)
  • 线程2的值也加1,并调用setSharedData(1),而不是您期望的setSharedData(2)

  • 解决此类问题的一种方法是不允许类的用户直接设置值,而应为他们提供一种原子增加值的方法:
    class SharedClass {
    private static int sharedData;

    public synchronized int getSharedData() {
    return sharedData;
    }

    public synchronized void incrementSharedData(int amount) {
    sharedData += amount;
    }
    }

    关于java - Java并发同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47856444/

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