当前位置: 首页 > 面试题库 >

Java监视器是否包含实例变量?

严阳秋
2023-03-14
问题内容

Java中的Monitor是否不限制对实例变量的访问,而不仅限于对已声明为 同步 的方法或在 同步 语句中进行代码访问?

我创建了两个线程,thread yinvokes sync()方法,该方法声明为已 同步,thread rinvokes
unsync()方法,该方法未声明为已同步。两者都调用共享对象上的方法s

Thread r可以在对象s监视器 仍由持有者的情况下修改对象的实例变量thread y

Java中的监视器是否不限制对实例变量的访问,而不仅限于对已声明 同步 的方法或在 同步 语句中的代码的访问?

public class Stuff {

    private int a = 10;

    public synchronized void sync() {
        long t1 = System.currentTimeMillis();
        System.out.println("Okay, I am in sync() method. "
                        + "I will be waiting for 10 seconds. Current Time = "
                        + System.currentTimeMillis());
        while (System.currentTimeMillis() - t1 < 10000);
        System.out.println("Okay, I have waited for 10 seconds. Current time is "
                        + System.currentTimeMillis()
                        + ". Now I will exit from sync() method, a = " + this.a);
    }

    public void unsync() {
        System.out.println("Alright, I am in unsync() method. The current time is "
                        + System.currentTimeMillis());
        this.a = this.a + 1;
        System.out.println(". The time of exit from unsync() method is "
                        + System.currentTimeMillis());

    }
}

class T1 extends Thread {

    Stuff s;

    public T1(Stuff s) {
        this.s = s;
    }

    public void run() {
        s.sync();
    }
}

class T2 extends Thread {

    Stuff s;

    public T2(Stuff s) {
        this.s = s;
    }

    public void run() {
        s.unsync();
    }
}

class Main {

    public static void main(String args[]) throws Exception {
        Stuff s = new Stuff();
        T1 y = new T1(s);
        T2 r = new T2(s);
        y.start();
        Thread.sleep(2000);
        r.start();
    }
}

该程序的输出如下:

好的,我在sync()方法中。我将等待10秒钟。当前时间= 1358801766310  
好吧,我在unsync()方法中。当前时间为1358801768343。退出unsync()方法的时间为1358801768343  
好吧,我已经等了十秒钟。当前时间是1358801776310。现在我将从sync()方法退出,a = 11

问题答案:

是。持有对象的监视器可防止另一个线程执行另一个代码块或在同一对象上同步。如果某个方法未同步,则无论另一个线程是否持有监视器,任何线程都可以随时调用它。

如果有机会至少有一个线程修改此共享状态,则对共享的已声明状态(甚至是只读访问)的每次访问都必须同步。



 类似资料:
  • 问题内容: 有时我需要测试哪个类声明了一些变量,如果具体类包含具有某些名称的变量,还有另一种方法可以测试该变量 问题答案: 如果我理解正确,则可以在超类中使用此代码来测试子类是否具有字段。 为什么不简单地添加这样的方法? 对我来说似乎更多面向对象,不会破坏封装。 就是说,我并没有真正理解您为什么首先需要它。

  • 问题内容: Java并发编程中所指的监视器是什么? 当我看到“每个对象都关联了一个监视器”时,这是什么意思? 这是一个特殊的对象吗? 问题答案: 监视器是控制对对象的并发访问的机制。 这使您可以执行以下操作: 线程1: 线程2: 这样可以防止线程1和2同时访问受监视(同步)的部分。一个将启动,并且监视器将阻止另一个在第一个完成之前访问该区域。 这不是一个特殊的对象。它的同步机制位于类层次结构的根目

  • 问题内容: 我的任务是制作一个带有实例变量的程序,该变量应该由用户输入。但是我什至不知道什么是实例变量。什么是实例变量?如何创建一个?它有什么作用? 问题答案: 实例变量是在类内部但在方法外部声明的变量: 现在可以在其他类中实例化此IronMan类以使用这些变量,例如: 这就是我们使用实例变量的方式。无耻插头:来自实例本免费的电子书拉到这里这里。

  • 问题内容: MSDN文档指出: COUNT(*)返回组中的项目数。这包括NULL值和重复项。 您如何在一个组中有一个空值?谁能解释他们要提出的观点? 问题答案: 如果你有这张桌子 表格1: 然后 输出为:

  • 在使用监视器的餐饮哲学家实现中,为什么提出()操作两次调用test()操作?

  • 问题内容: 如何检查字符串是否包含\ n或换行符? 问题答案: 如果字符串是在同一程序中构造的,则建议使用以下命令: 但是,如果您指定使用\ n,则此驱动程序说明了如何做: 导致 回应您的评论: 结果是