线程1通过synchronized将obj锁住,线程2还能否并发修改obj的内容?
代码示例:
public class ThreadTest {
private String name = "step1";
public void step1(){
synchronized (this){
try {
System.out.println("********t1 sleep******1 name=" + this.name);
Thread.sleep(10000);
System.out.println("********t1 sleep******2 name=" + this.name);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void step2(){ //synchronized保留与否有啥区别?
this.name = "step2";
System.out.println("********t2 update****** name=" + this.name);
}
public static void main(String[] args) throws Exception{
ThreadTest threadTest = new ThreadTest();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
threadTest.step1();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
threadTest.step2();
}
});
t1.start();
Thread.sleep(100);
t2.start();
}
}
运行结果:
********t1 sleep******1 name=step1
********t1 sleep******2 name=step1
********t2 update****** name=step2
如果将step2()方法的synchronized去掉,运行结果:
********t1 sleep******1 name=step1
********t2 update****** name=step2
********t1 sleep******2 name=step2
说明:即使对象监视器被锁住,非synchronized修饰的方法依然可以修改对象监视器的值。