日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java synchronized boolean_java中synchronized关键字

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java synchronized boolean_java中synchronized关键字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

代碼示例:

package com.test;

/*

* x,y值為什么不能保持相同;

*

*/

public class Pair implements Runnable{

boolean b = false;

private int x;

private int y;

public Pair(int x,int y){

this.x = x;

this.y = y;

}

public Pair(){

}

public void incrementX(){

x++;

}

public void incrementY(){

y++;

}

public String toString(){

return "x: " + x + " ,y: "+y;

}

public void run(){

while(!b){

synchronized(this){

incrementX();

incrementY();

}

}

}

public boolean checkState(){

if(x!=y){

System.out.println("values not equal:"+this);

return b = true;

}

return b;

}

public static void main(String args[]){

Pair p = new Pair(0,0);

new Thread(p).start();

while(true){

System.out.println(p);

if(p.checkState()){

System.exit(0);

}

}

}

}

為什么以上代碼是線程不安全的?

在百科里面有這么一句:當(dāng)一個(gè)線程訪問object的一個(gè)synchronized(this)同步代碼塊時(shí),另一個(gè)線程仍然可以訪問該object中的除synchronized(this)同步代碼塊以外的部分。

分析:請注意,在主線程中,會在某一個(gè)時(shí)刻調(diào)用p.checkState(),而這個(gè)方法并沒有和run方法中的

synchronized塊代碼同步。因?yàn)閏heckState方法不是同步方法。某一個(gè)時(shí)刻,synchronized塊失去了cpu。

而下一個(gè)卻要執(zhí)行主線程的p.checkState(),這個(gè)時(shí)候是可以訪問x 和 y變量的。

解決的方法是,需要同步的方法上,加一個(gè)synchronized。這樣就能和run方法中的synchronized塊進(jìn)行同步。

總結(jié)

以上是生活随笔為你收集整理的java synchronized boolean_java中synchronized关键字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。