題目 synchronized怎麼實現線程同步?請修改《每天一道Java題[10]》中的MyRunnableThread類以解決三個線程都獲取到10的問題。 解答 方法一: 採用synchronized關鍵字包裹需要保證線程安全的代碼塊,來實現線程同步。語法格式為: 《每天一道Java題[10]》中 ...
題目
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的都是新對象,能否實現同步的效果?
解答:不能。因為不同的線程對應不同的同步鎖,不具有排他性,故線程同步會失效。