1. 程式人生 > >每天一道Java題[11]

每天一道Java題[11]

解答 huang 同步鎖 每次 都是 對象 問題 不能 color

題目

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,那它怎麽獲取同步鎖?

解答:

  1. 對於實例的同步方法,使用this,即當前實例對象作為同步鎖。
  2. 對於靜態的同步方法,使用當前類的字節碼對象。

2.對於方法一,如果每次傳給synchronized的都是新對象,能否實現同步的效果?

解答:不能。因為不同的線程對應不同的同步鎖,不具有排他性,故線程同步會失效。

每天一道Java題[11]