標籤:線程同步 class 同步鎖 function log archive 執行個體 htm logs
題目
synchronized怎麼實現線程同步?請修改《每天一道Java題[10]》中的MyRunnableThread類以解決三個線程都擷取到10的問題。
解答
方法一:
採用synchronized關鍵字包裹需要保證安全執行緒的代碼塊,來實現線程同步。文法格式為:
Synchronized(expression){ //需同步的代碼}
《每天一道Java題[10]》中的MyRunnableThread類修改為:
package me.huangzijian;public class MyRunnableThread implements Runnable { private int num = 10; private Object obj = new Object(); @Override public void run() { int count = num; for (int i = 0; i < count; i++) { synchronized (obj) { System.out.println(Thread.currentThread().getName() + ":" + num); num--; } } }}
方法二:
採用synchronized關鍵字來修飾方法,從而用整個方法來進程線程同步。文法格式為:
public synchronized void function(){ //方法代碼}
《每天一道Java題[10]》中的MyRunnableThread類修改為:
package me.huangzijian;public class MyRunnableThread implements Runnable { private int num = 10; private Object obj = new Object(); @Override public synchronized void run() { int count = num; for (int i = 0; i < count; i++) { System.out.println(Thread.currentThread().getName() + ":" + num); num--; } }}
發散思維
1.synchronized關鍵字修飾方法,沒有expression,那它怎麼擷取同步鎖?
解答:
- 對於執行個體的同步方法,使用this,即當前執行個體對象作為同步鎖。
- 對於靜態同步方法,使用當前類的位元組碼對象。
2.對於方法一,如果每次傳給synchronized的都是新對象,能否實現同步的效果?
解答:不能。因為不同的線程對應不同的同步鎖,不具有排他性,故線程同步會失效。
每天一道Java題[11]