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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

相关疑惑解决,java线程虚假唤醒等等问题

發布時間:2024/10/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相关疑惑解决,java线程虚假唤醒等等问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. System.out.println方法是線程安全的

之前一直疑惑為啥下面案例中的主線程中num = 1會對線程A可見,注意沒有加volatile修飾

class Test1{//public volatile static int num =0;public static int num =0;public static void main(String[] args) {new Thread(()->{while (num==0){System.out.println(Thread.currentThread().getName());}},"線程A").start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}num = 1;System.out.println(num);} }

后來百度一下知道原來println()方法是線程安全的

//println方法的實現public void println(int x) {synchronized (this) {print(x);newLine();}}

JMM關于Synchronized的兩條規定:

線程加鎖時,講清空工作內存中共享變量的值,從而使用共享變量是需要從主內存中重新讀取最新的值(加鎖與解鎖需要統一把鎖)
線程解鎖前,必須把共享變量的最新值刷新到主內存中;

2. 虛假喚醒

public class PcModel {public static void main(String[] args){SynResource synResource = new SynResource();new Thread(()->{try {for (int i = 0; i < 10; i++) {synResource.increment();}} catch (InterruptedException e) {e.printStackTrace();}},"生產者").start();new Thread(()->{try {for (int i = 0; i < 10; i++) {synResource.increment();}} catch (InterruptedException e) {e.printStackTrace();}},"生產者副本").start();new Thread(()->{try {for (int i = 0; i < 10; i++) {synResource.decrement();}} catch (InterruptedException e) {e.printStackTrace();}},"消費者").start();new Thread(()->{try {for (int i = 0; i < 10; i++) {synResource.decrement();}} catch (InterruptedException e) {e.printStackTrace();}},"消費者副本").start();} }class SynResource{volatile private int count =0;synchronized void increment() throws InterruptedException {if (count == 1){this.wait();}System.out.println(Thread.currentThread().getName() + "+ 1");count++;this.notifyAll();}synchronized void decrement() throws InterruptedException {if (count == 0){this.wait();}System.out.println(Thread.currentThread().getName() + "- 1");count--;this.notifyAll();} }

上面是一個經典的生產者-消費者模型。當只有一個生產者和一個消費者時程序能正常運行,但如果按照上面的例子來運行??梢园l現運行結果并不是我們所想要的結果。這是因為if語句執行完后會接著向下執行,即當線程被喚醒重新獲得鎖后會接著向下運行,這時就會產生虛假喚醒的問題了(生產者和生產者副本都運行至this.wait()),如果把if語句改成while就能避免此中現象產生。

3. ReadWriteLock

  • 如果當前是寫鎖被占有了,只有當寫鎖的數據降為0時才認為釋放成功;否則失敗。因為只要有寫鎖,那么除了占有寫鎖的那個線程,其他線程即不可以獲得讀鎖,也不能獲得寫鎖
  • 如果當前是讀鎖被占有了,那么只有在寫鎖的個數為0時才認為釋放成功。因為一旦有寫鎖,別的任何線程都不應該再獲得讀鎖了,除了獲得寫鎖的那個線程。

4. static synchronized 修飾的方法中

當前鎖對象是 類.calss對象 注意與非靜態方法的區別

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的相关疑惑解决,java线程虚假唤醒等等问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久九九国产精品 | 午夜影院91| 欧美片| 中文字幕第十一页 | 在线观看的av网址 | 乱色熟女综合一区二区三区 | 制服.丝袜.亚洲.中文.综合懂 | 91插插插插插插插 | 中国免费一级片 | 欧洲久久久久 | 伊人超碰 | 国产一区欧美二区 | 亚洲免费一二三区 | 国精产品一区一区三区 | 日韩一区二区影院 | 伊人激情综合 | 秋霞欧美一区二区三区视频免费 | 在线视频激情小说 | 8x8x永久免费视频 | 天堂网av手机版 | 狠狠狠 | 午夜影视大全 | 国产午夜精品福利视频 | 一本大道久久 | 日本特黄视频 | 天堂√8在线中文 | 国产av毛片| av电影在线不卡 | a猛片| 亚洲精品 日韩无码 | 国产av一区二区三区传媒 | 天堂影视av| 日本不卡一区在线 | 8x8ⅹ成人永久免费视频 | 国产在线传媒 | 麻豆av影视| 欧美日韩国产片 | 青青草视频免费 | 一本黄色片 | 欧美综合久久久 | 中国毛片网 | 毛片免费播放 | 四虎精品在线观看 | 久久成人激情 | 欧美黑人三级 | 超碰在线cao| 日本高清视频www夜色资源 | 男欢女爱久石 | 韩国日本中文字幕 | 色屋永久| 日本大尺度吃奶做爰视频 | 日b视频免费看 | 亚洲精品视频免费看 | 少妇精品偷拍高潮白浆 | av成人在线免费观看 | 国产乱淫视频 | 色男天堂| 久久亚洲熟女cc98cm | 国产美女免费视频 | 污污小说在线观看 | 无码国产精品96久久久久 | 黄色美女视频网站 | 亚洲h网站 | 日韩有码av | 污污的视频在线免费观看 | 亚洲一区二区日韩 | 好吊色一区二区 | 亚洲欧美日本另类 | 色小姐综合 | 国产午夜精品一区二区理论影院 | 男人日女人在线观看 | 精品国产一区二区三区性色 | 国语一区二区 | 天堂中文在线8 | 久久视频中文字幕 | 成人a区 | 免费看a毛片 | 黑人毛片网站 | 亚欧洲精品 | 欧美成人吸奶水做爰 | 成人午夜影院 | 久草黄色 | 欧美成人dvd在线视频 | 春色校园激情 | 日本视频精品 | 手机在线观看av网站 | 天码人妻一区二区三区在线看 | 久久久性视频 | 午夜精产品一区二区在线观看的 | 毛片黄色一级 | 最新国产精品视频 | 东北少妇露脸无套对白 | 日韩毛片视频 | 四季av在线一区二区三区 | 久久午夜夜伦鲁鲁片 | 丁香久久综合 | 日韩中文网 | 黑人巨大精品欧美一区二区免费 | 亚洲欧美字幕 |