Sec*_*ach 4 java multithreading exception notify
import java.math.BigInteger;
class Numbers {
    final static int NUMBER = 2;
    final static int POWER = 4;
    static long msecs;
    static BigInteger result;
    static Boolean done = false;
    public static void main(String[] args) {
        BigInteger number = BigInteger.valueOf(NUMBER);
        result = number;
        //Boolean done = false;
        Runnable pow = () -> {
            System.out.println(number + " pow " + POWER + " = " + number.pow(POWER));
            synchronized (done) {
                done = true;
                done.notifyAll();
            }
        };
        Runnable sum = () -> {
            for(int i = 2; i<POWER; i=i*i) {
                result = result.multiply(result);
            }
            System.out.println(number + " sum " + POWER + " = " + result);
            synchronized (done) {
                done = true;
                done.notifyAll();
            }
        };
        Runnable time = () -> {
            for(msecs = 0; true; msecs++) {
                try {
                    Thread.sleep(1);
                } catch(InterruptedException e) {
                    //nic
                }
            }
        };
        Thread timet = new Thread(time);
        Thread sumt = new Thread(sum);
        Thread powt = new Thread(pow);
        timet.start();
        powt.start();
        synchronized (done) {
            while(!done) {
                try {
                    done.wait();
                } catch (InterruptedException e) {
                    //nic
                }
            }
        }
        timet.interrupt();
        powt.interrupt();
        System.out.println("Pow time " + msecs + " msecs.");
        done = false;
        timet.start();
        sumt.start();
        try {
            synchronized (done) {
                while (!done) {
                    done.wait();
                }
            }
        } catch (InterruptedException e) {
            //nic
        }
        timet.interrupt();
        sumt.interrupt();
        System.out.println("Sum time " + msecs + " msecs.");
    }
}
我想检查这两种方法之间的时间差异,但done.notifyAll()不断抛出IllegalMonitorStateException.
问题在这里:
synchronized (done) {
    done = true;//<---problem
    done.notifyAll();
}
既然你要分配新的值done就意味着你正在执行notifyAll的Boolean.TRUE,但您的同步块正在使用的显示器Boolean.FALSE.并且由于notifyAll需要线程拥有执行它的对象的监视器,因此它会抛出IllegalMonitorStateException.
因此,请勿更改同步对象的值.还要避免在可用于所有类(公共常量/文字)的对象上进行同步,因为您冒着其他人会有相同想法的风险,并且还会在同步中使用它们,这可能会让您感到痛苦.
锁只能从类中属于它们才能访问.所以从Jon Skeet中获取示例(lockObject上的synchronized和使用它作为锁之间的区别是什么?)并自行同步
private final Object lock = new Object();
| 归档时间: | 
 | 
| 查看次数: | 645 次 | 
| 最近记录: |