为什么结果会出现负的情况?
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--;
}
}
}
}
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才会跳出循环