package com.Synchronized;
public class SynchronizedTest {
public static void main(String[] args) {
Test2 t = new Test2();
//Test3 t = new Test3();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
t.A();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
t.A();
}
}).start();
}
}
class Test2 {
private Integer i = 41;
public void A() {
synchronized (i) {
System.out.println(i);
i = 45;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Test3 {
private Student s = new Student();
public void A() {
synchronized (s) {
System.out.println(s);
s.name = "李青";
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Student {
public String name = "亚索";
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
41,45同时打印

李青是延迟三秒后打印的
总结:可以看出当synchronized()中被加锁的对象如果是基本类型的包装类型或者是String类型,在一个线程获得该对象的锁之后在线程体里面如果改变了其引用对象,那么他所持有的 锁会立即被释放,此时极有可能会造成安全问题,如果是一些其它类型,当我们改变它们的属性(成员变量)时,锁并不会被释放。