Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Java线程问题_Multithreading - Fatal编程技术网

Multithreading Java线程问题

Multithreading Java线程问题,multithreading,Multithreading,下面的代码不应该打印出正确的余额(100),但它每次都为我打印出100。为什么呢?以下代码似乎不是线程安全的 public class ThreadObject implements Runnable{ private int balance; public ThreadObject() { super(); } public void add() { int i = balance; balance = i

下面的代码不应该打印出正确的余额(100),但它每次都为我打印出100。为什么呢?以下代码似乎不是线程安全的

public class ThreadObject implements Runnable{

    private int balance;

    public ThreadObject() {
        super();
    }

    public void add() {
        int i = balance;
        balance = i + 1;
    }

    public void run() {     
        for(int i=0;i<50;i++) {
            add(); 
            System.out.println("balance is " + balance);
        }
    }

}

public class ThreadMain {

    public static void main(String[] args) {

        ThreadObject to1 = new ThreadObject();
        Thread t1 = new Thread(to1);
        Thread t2 = new Thread(to1);
        t1.start();
        t2.start();

    }
} 
公共类ThreadObject实现可运行{
私人国际收支平衡;
公共线程对象(){
超级();
}
公共无效添加(){
int i=平衡;
余额=i+1;
}
public void run(){

对于(int i=0;i而言,
println
可能比更新余额的代码慢数千倍。每个线程几乎花费所有时间打印,因此它们同时更新余额的可能性非常小

在读
i
和写
i+1
之间增加一点睡眠时间


这里有一个卑鄙的问题:运行上述代码后,
i
的最小可能值是多少?

将您的println向上移动一点,以确定这不是线程安全的。如果您仍然看不到任何更改,请再大50(比如5000或更多)

public void add(){
int i=平衡;
系统输出打印项次(“余额为”+余额);
余额=i+1;
}
public void run(){

对于(int i=0;iis最小值50?因为我能想到的最坏情况是T1进入睡眠,T2接管并更新i,T1唤醒并更新平衡,T2唤醒并更新平衡…并以这种模式继续。或者还有比这更糟的情况吗?我似乎不明白。你能解释一下吗?
public void add() {
    int i = balance;
    System.out.println("balance is " + balance);
    balance = i + 1;
}

public void run() {     
    for(int i=0;i<50;i++) {
        add(); 
    }
}