java中的synchronized块之后的代码无法访问,但semp.release()不是

时间:2017-04-25 03:42:35

标签: java multithreading

Thread faculty = new Thread(() -> {
                try {
                    while (true) {


         boolean is_grab = false;
                    semp.acquire();
                    if (candy > 0) {
                        System.out.println("No." + NO + " faculty grabs a candy");
                        candy--;
                        is_grab = true;
                        System.out.println("Candy num left:" + candy);
                    }
                    semp.release();
                    if (is_grab) {
                        Thread.sleep(1000);
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        faculty.start();
    }

在上面的代码中,我使用信号量实现进行同步和  if(is_grab){Thread.sleep(1000);可以执行。

但是,在下面的代码中,

Thread faculty = new Thread(() -> {
                synchronized (Bowl.class) {
                    while (true) {
                        while (Bowl.candy <= 0) {
                            try {
                                Bowl.class.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("No." + NO + " faculty grabs a candy");
                        Bowl.candy--;
                        System.out.println("Candy num left:" + Bowl.candy);
                        Bowl.class.notifyAll();
                    }
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });

我在Bowl.class上使用synchronized,但尝试{sleep}无法访问。为什么呢?

1 个答案:

答案 0 :(得分:0)

在下面的示例中,没有break语句可以退出while(true)循环。