當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的synchronized(this)同步代碼塊時(shí)齐板,一段時(shí)間內(nèi)只能有一個(gè)線程被執(zhí)行补疑,另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后以后才能執(zhí)行該代碼塊。
/**
* synchronized同步代碼的使用
* @author wuyoushan
* @date 2017/1/23.
*/
public class ObjectService {
public void serviceMethod(){
try {
synchronized (this){
System.out.println("begin Time="+System.currentTimeMillis());
Thread.sleep(2000);
System.out.println("end end="+System.currentTimeMillis());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**ThreadA線程類
* synchronized同步代碼的使用
* @author wuyoushan
* @date 2017/1/23.
*/
public class ThreadA extends Thread{
private ObjectService service;
public ThreadA(ObjectService service) {
this.service = service;
}
@Override
public void run() {
super.run();
service.serviceMethod();
}
}
/**
* ThreadA線程類
* synchronized同步代碼的使用
* @author wuyoushan
* @date 2017/1/23.
*/
public class ThreadB extends Thread{
private ObjectService service;
public ThreadB(ObjectService service) {
this.service = service;
}
@Override
public void run() {
super.run();
service.serviceMethod();
}
}
/**
* 運(yùn)行實(shí)例
* synchronized同步代碼的使用
* @author wuyoushan
* @date 2017/1/23.
*/
public class Run {
public static void main(String[] args) {
ObjectService service=new ObjectService();
ThreadA a=new ThreadA(service);
a.setName("a");
a.start();
ThreadB b=new ThreadB(service);
b.setName("b");
b.start();
}
}
程序的運(yùn)行結(jié)果為:
begin Time=1492042714510
end end=1492042716511
begin Time=1492042716511
end end=1492042718511
上面的實(shí)驗(yàn)雖然使用了synchronized同步代碼塊,但執(zhí)行的效率還是沒有提高,執(zhí)行的效果還是同步運(yùn)行的蹲坷。
如何用synchronized同步代碼解決程序執(zhí)行效率低的問題呢?
摘選自 java多線程核心編程技術(shù)-2.2.2