当synchronized修饰一个方法或者代码时,非同步的方法可以访问和修改synchronized修饰的方法或者代码块中的遍历。
代码:
package indi.liusai.test;
public class test implements Runnable{
public static void main(String[] args) {
test test=new test();
Thread t=new Thread(test);
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
test.m2();
}
private int b=100;
public void run() {
m1();
}
private void m1() {
synchronized(this){
b=1000;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(b);
}
}
private void m2() {
System.out.println(b);
}
}
输出的结果为:
1000
1000
当修改m2的方法为:
private void m2() {
b=20;
System.out.println(b);
}
输出的结果为:
20
20
当添加一个synchronized方法m3,并在run()方法中调用m1(),m3():
private synchronized void m3() {
b=50;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(b);
}
输出的结果为:
20
20
50
这说明在运行同步方法时,非同步方法m2更改了m1中的变量的值。若只运行m1,m3,不运行m2,则输出的结果为:
1000
50
这说明同步的方法在运行时只有当m1运行完释放锁后,才会运行m3。