簡體   English   中英

了解Java中的同步方法示例

[英]Understanding Synchronized method example in Java

我正在閱讀此鏈接。 http://tutorials.jenkov.com/java-concurrency/synchronized.html

例子是:

public class Counter{

  long count = 0;

   public synchronized void add(long value){
     this.count += value;
     System.out.println("Thread="+Thread.currentThread().getId()+"value ="+count);
   }
}

public class CounterThread extends Thread{

 protected Counter counter = null;

 public CounterThread(Counter counter){
    this.counter = counter;
 }

 public void run() {
  for(int i=0; i<10; i++){
       counter.add(i);
    }
 }
}


public class Jenkov2 {

public static void main(String[] args){
  Counter counter = new Counter();
  Thread  threadA = new CounterThread(counter);
  Thread  threadB = new CounterThread(counter);


  threadA.start();
  threadB.start();      
}
 }

在我的系統上運行此命令時,它始終會提供固定的輸出。

    Thread=9value =0
    Thread=9value =1
    Thread=9value =3
    Thread=9value =6
    Thread=9value =10
    Thread=9value =15
    Thread=9value =21
    Thread=9value =28
    Thread=9value =36
    Thread=9value =45
    Thread=10value =45
    Thread=10value =46
    Thread=10value =48
    Thread=10value =51
    Thread=10value =55
    Thread=10value =60
    Thread=10value =66
    Thread=10value =73
    Thread=10value =81
    Thread=10value =90

我多次運行它,但輸出始終相同。 我原以為它會在兩個線程之間切換,兩個線程完成后的值為90。 按照我的說法,它將是這樣的:線程調用run方法,i為0,將添加0,並且由於方法已同步,它將在添加零后返回,然后在i的下一次迭代之前進行for循環,上下文切換發生並且線程B運行並且將添加值0。

我的理解是正確的,並且輸出在線程之間也可能有所不同,或者我缺少一些概念。

每當您的一個線程繞過它的循環時,它都會釋放鎖定,然后立即嘗試再次鎖定它。

看起來在您的系統上,鎖定機制沒有“公平性”,僅釋放鎖的線程便可以在另一個線程甚至不知道它被釋放之前再次抓住它。

在其他系統上,它的行為可能有所不同。 但是話又說回來,你永遠都不知道。

如果您想嘗試@Zabuza建議的內容,請更改run()方法,

public void run() {
    for(int i=0; i<10; i++){
        counter.add(i);
        Thread.sleep(10);
    }
 }

睡眠調用將使另一個線程有機會喚醒並抓住鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM