java monitor是否包含实例变量?
是不是java中的监视器不限制对实例变量的访问,而只限制声明为synchronized的方法或者同步语句中的代码?
我已经创建了两个线程, thread y
调用sync方法,它被声明为synchronized,而thread r
调用unsync方法,该方法未声明为synchronized。 两者都在共享对象上调用方法。
Thread r
能够修改对象s
的实例变量,同时该对象s
监视器或锁仍被thread y
。
是Java中的监视器不限制对实例变量的访问,并且只限制声明为synchronized的方法或同步语句中的代码?
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 currrent 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 m { 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(); } }
该计划的输出如下:
好的,我是同步方法。 我将等待10秒钟。 当前时间= 1358801766310 好吧,我在非同步方法的时间是1358801768343 退出非同步方法的时间是1358801768343 好的,我等了10秒钟。 当前时间是1358801776310.Now我将退出同步方法, a = 11
是。 保持对象的监视器可防止另一个线程执行另一个代码块或在同一对象上同步。 如果方法未同步,则任何线程都可以随时调用它,无论另一个线程是否持有监视器。
如果至少有一个线程可能修改此共享状态,则必须同步对共享声明,甚至只读访问的每次访问。
是不是java中的监视器不限制对实例变量的访问,而只限制声明为synchronized的方法或者同步语句中的代码?
是。
其中,同步块(或方法)是互斥的。 这不会阻止用作锁的对象(监视器,让它称之为lock
)在这些块之外使用,在这种情况下不会执行同步。 例如,一个线程可以读取或写入lock
而另一个线程位于同步块中,其中lock
是监视器。
如果要限制对变量的访问,则需要确保在持有锁定时进行所有访问(任何锁定,前提是每次访问都相同)。
使方法同步有两个影响:
首先,不可能对同一对象上的两个同步方法的调用进行交错。 当一个线程正在为对象执行同步方法时,所有其他线程都会调用同一对象的同步方法(暂停执行),直到第一个线程完成对象为止。
其次,当同步方法退出时,它会自动与同一对象的同步方法的任何后续调用建立先发生关系。 这可以保证对所有线程都可以看到对象状态的更改。
(来源: Java教程 )
- CompileThreshold,Tier2CompileThreshold,Tier3CompileThreshold和Tier4CompileThreshold控制什么?
- 在没有括号的Java中调用新对象的方法:操作违规的顺序?