大家都知道synchronized是一個(gè)對(duì)象鎖岩榆,所以當(dāng)對(duì)象變化時(shí)各薇,鎖就會(huì)消失,就會(huì)沒有同步效果鳞仙。
請(qǐng)看下面的問題:
package Thread;
/**
* Created by zhangzheming on 2018/1/15.
*/
public class ChangeLock {
private String lock = "lock";
private void method(){
synchronized (lock){
try {
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"開始");
lock = "lock modify";
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"完成");
}catch (Exception e){
e.printStackTrace();
}
}
}
public static void main(String[] args){
final ChangeLock locks = new ChangeLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
locks.method();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
locks.method();
}
});
t1.start();
t2.start();
}
}
結(jié)果是兩個(gè)線程是幾乎是同時(shí)完成任務(wù)寇蚊,為什么呢?
那是因?yàn)樵谶M(jìn)行method方法執(zhí)行時(shí)棍好,鎖對(duì)象改變了仗岸,這樣同步機(jī)制就消失,沒有了同步效果借笙,這樣對(duì)于多線程操作時(shí)扒怖,便是每個(gè)線程對(duì)象都可以同時(shí)進(jìn)行操作。
但是如果我們對(duì)class對(duì)象進(jìn)行修改是否也會(huì)有上述情況呢业稼?
答案是否定的盗痒。
package Thread;
/**
* Created by zhangzheming on 2018/1/15.
*/
public class ModifyLock {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public synchronized void changeAttribute(String name,int age){
try{
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"開始");
this.setName(name);
this.setAge(age);
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"修改對(duì)象內(nèi)容為:"+this.getName()+","+this.getAge());
Thread.sleep(2000);
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()+"結(jié)束");
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
final ModifyLock locks = new ModifyLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
locks.changeAttribute("zhangsan",34);
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
locks.changeAttribute("lisi",345);
}
},"t2");
t1.start();
t2.start();
}
}
結(jié)果
所以對(duì)于類對(duì)象的屬性進(jìn)行修改,并不影響鎖的效果低散!