【问题标题】:Synchronized method in Java monitorJava监视器中的同步方法
【发布时间】:2017-10-02 22:36:26
【问题描述】:

我目前正在学习 Java 中监视器的使用,但我不知道同步方法是如何工作的。

我了解,当一个线程在同步方法中时,另一个线程不能在同步方法中,并且睡眠不会剥夺监视器自己的所有权。

所以我试着写一个代码来测试一下

import java.util.Random;
public class ex3 extends Thread {

private static int nbA=0;
private static int nbB=0;
public static final Random rand = new Random();

public void run(){
    while(true){
        System.out.println(nbA+" "+nbB);
        try{
            Thread.sleep(rand.nextInt(500));
        }catch (Exception e ){e.printStackTrace();}
        if (rand.nextBoolean()){
            try {
                A();
            } catch (InterruptedException e) {}
        }else{
            try {
                B();
            } catch (InterruptedException e) {}
        }
    }
}

public synchronized void A() throws InterruptedException{
    nbA++;
    Thread.sleep(rand.nextInt(500));
    nbA--;
}

public synchronized void B() throws InterruptedException{   
    nbB++;
    Thread.sleep(rand.nextInt(500));
    nbB--;
}

public static void main(String[] argv){
    new ex3().start();
    new ex3().start();
    new ex3().start();
}
}

我认为 nbA 或 nbB 不可能优于 1,或者 nbB 和 nbA 都 >0 但它正在发生

我误会了什么?

抱歉英语不好。

【问题讨论】:

    标签: java multithreading synchronized monitor


    【解决方案1】:

    您正在对不同的对象进行同步:synchronized 非静态方法在 this 上同步,因此每个 new ex3() 实例都可以像未同步一样有效地工作。

    同步实例方法完全等价于:

    public void A() {
        synchronized (this) {
            // The body.
        }
    }
    

    要么创建同步方法static,要么显式同步类(或其他共享对象):

    public void A() throws InterruptedException{
        synchronized (ex3.class) {
            nbA++;
            Thread.sleep(rand.nextInt(500));
            nbA--;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我了解,当一个线程在同步方法中时,另一个线程不能在同步方法中

      错了。它不能在同步方法内在同一个对象上同步。它可以在任何其他同步方法内,或在不同对象上同步的同一方法内,如这里。

      睡眠不会剥夺显示器的所有权。

      正确。

      NB Per Brinch Hansen 不认为 Java 有监视器,而是他发明了它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多