java多线程。。。。。

为什么结果会出现负的情况?
public class MyThreadTest {
public static void main(String[] args) {
MyThread m=new MyThread();
Thread t1=new Thread(m,"线程1");
Thread t2=new Thread(m,"线程2");
Thread t3=new Thread(m,"线程3");
Thread t4=new Thread(m,"线程4");
t1.start();
t2.start();
t3.start();
t4.start();

}

}
class MyThread implements Runnable{
private int sum=10;

private Object lock=new Object();
@Override
public void run() {

    while(sum>0) {
    //锁
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName()+" "+sum);
            sum--;

        }

        }
        }

    }

7个回答

lock要用全局对象。不然各个线程各自减sum

sum是负数才会跳出while

例如,当sum = 1时,这时候所有的线程都知道,sum为1,所有的都等在被锁住的入口,只有一个进去了(记为a)。a减了sum之后,sum=0;再是b进去了,b再减1,sum=-1;以此类推。
需要积分下载东西,叩谢。

主要是太贪心了。
while分两步。
1:判断
2:执行
在你sum为1的时候,四个线程都判断为true他们已经进了循环,不走完不会离开的,都要--的!!!

我教你个方法:
你的sum-.替换为
if(sum==1){
sum--;
new exception();
}else{
sum--;
}
这样就可以保证别人碰不了你的数字了。

同步锁使得这个四次子线程执行,依次进行,

同步锁用在while之前
private static Object lock=new Object(); //静态全局锁
@Override
public void run() {

synchronized (lock) { //先锁定再判断,在使用(包括读取、修改、判断等任何操作)一个共享变量前一定要先锁定
while(sum>0) {
//锁
System.out.println(Thread.currentThread().getName()+" "+sum);
sum--;

    }

    }
    }

}

判断那里 sum>0才会跳出循环

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问