簡體   English   中英

用同步塊替換volatile不起作用

[英]Replacing volatile with synchronized block is not working

我正在閱讀教程。 我了解了可變關鍵字的用法。 但是,當我嘗試在同步塊中對關注變量進行操作而未使用volatile關鍵字的情況下達到相同的結果時,則無法正常工作。 它引發IllegalMonitorStateException。 這是我嘗試的修改后的代碼。

public class VolatileTest {
private static Integer MY_INT = 0;

public static void main(String[] args) {
    new ChangeListener().start();
    new ChangeMaker().start();
}

static class ChangeListener extends Thread {
    @Override
    public void run() {
         synchronized(MY_INT){
        int local_value = MY_INT;
        while ( local_value < 5){
            if( local_value!= MY_INT){
                System.out.format("Got Change for MY_INT : {0}", MY_INT);
                 local_value= MY_INT; 
                  try {
                MY_INT.wait();
            } catch (Exception e) { e.printStackTrace(); }}
            }
        }
    }
}

static class ChangeMaker extends Thread{
    @Override
    public void run() {
         synchronized(MY_INT){
        int local_value = MY_INT;
        while (MY_INT <5){
            System.out.format("Incrementing MY_INT to {0}", local_value+1);
            MY_INT = ++local_value;
            try {
                MY_INT.notify();
            } catch (Exception e) { e.printStackTrace(); }
        }
    }
}}}

我想知道的是,在這種情況下,可以使用同步塊替換掉volatile,如果是,那么該怎么做? 謝謝。

問題在這里:

 MY_INT = ++local_value;

MY_INT是一個Integer變量,當您為其分配一個新值時,您將在此處鎖定的對象:

 synchronized(MY_INT){

將與您在此處通知的對象不同:

  MY_INT.notify();

...這將導致異常。


解決方案是使鎖對象成為static final 顯然,這意味着您無法分配給它...但這就是重點!

暫無
暫無

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

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