Java多執行緒中同步Boolean問題

2021-07-09 04:42:33 字數 770 閱讀 8980

最近在使用netty寫個小玩意兒,其中在通訊時,server給client的響應中,要包含一組資訊,直到client成功收到並解析。

這需要有乙個flag,一開始我使用boolean, 變數名receivedpeerlist,以構造函式引數的形式傳遞進channelhandler中,然後在主線程和netty的channelread事件中同步它。

用法如下:

channelread中修改它:

主線程中使用它:

剛開始覺得這個很簡單,沒什麼問題。後來測試中出現了莫名其妙的bug。經過除錯後,發現,主線程和channelread中的receivedpeerlist不是同乙個物件:

上網查資料,發現了一片iteye的文章不要同步boolean。看完之後,我理解的就是:編譯器會把所有的boolean變數指向boolean.true和boolean.false兩個常量,所以這種同步方式是無效的(因為主線程中的receivedpeerlist一直指向boolean.false,而channelread中一直指向boolean.true)。

解決方案是使用atomicboolean。

Java中多執行緒的同步

package 基礎實戰 消費者與生產者的問題 生產者負責生產資料,消費者負責取走資料 生產者每生產完一組資料之後,消費者就要取走一組資料 解決資料錯位問題 非同步操作所造成 class infocatch interruptedexception e this.title title 等待1s種的...

JAVA多執行緒同步

1.同步 塊 synchronized 物件 例程 package cn.wf.thread1 多執行緒同步 同步 塊 author wf public class thread test class thread01 implements runnable trycatch interrupted...

java多執行緒 同步

2019獨角獸企業重金招聘python工程師標準 synchronized關鍵字鎖的物件可以是方法 變數 類和當前例項。synchronized不能被繼承,子類將自動去除synchronized關鍵字 public synchronized void 變為public void 方法public s...