導航:首頁 > 編程語言 > java並發編程例子

java並發編程例子

發布時間:2022-10-08 13:41:15

A. 《java並發編程實戰》上面的一個問題

總共就三種情況!!!!1.無限循環,number的值為0:在主線程即main方法中對ready的設置(即ready = true)還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了ready的值(並保留了副本),然後載入到Java棧中,此時ready 一直為false所以出現死循環。number的值也可以類似推理,在主線程即main方法中對number的設置(即number= 42)還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了number的值(並保留了副本),然後載入到Java棧中,此時number一直為0(只是沒有列印出來而已);

2.無限循環,number的值為42:在主線程即main方法中對ready的設置(即ready = true)還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了ready的值(並保留了副本),然後載入到Java棧中,此時ready 一直為false所以出現死循環。在主線程即main方法中對number的設置(即number= 42)後(即number的值已經寫回了主存),ReaderThread 線程才開始執行此時讀取的number為42(只是沒有列印出來而已);

3.輸出0:在主線程即main方法中對ready的設置(即ready = true)後(即ready的值已經寫回了主存),還沒來得及寫回主存(靜態變數保存在方法區),ReaderThread 線程就已經讀取了number的值(並保留了副本),然後載入到Java棧中,此時number為0;

至於為什麼會出現ready = true寫回主存後,number = 42還沒寫回主存。這應該是由於Java虛擬機的一種優化技術叫指令重排序,number = 42不一定會在ready = true前面執行,得看Java虛擬機是怎麼優化的。

B. 電腦培訓分享Java 並發編程:核心理論

並發編程是Java程序員最重要的技能之一,也是最難掌握的一種技能。它要求編程者對計算機最底層的運作原理有深刻的理解,同時要求編程者邏輯清晰、思維縝密,這樣才能寫出高效、安全、可靠的多線程並發程序。電腦培訓http://www.kmbdqn.com/發現本系列會從線程間協調的方式(wait、notify、notifyAll)、Synchronized及Volatile的本質入手,詳細解釋JDK為我們提供的每種並發工具和底層實現機制。在此基礎上,我們會進一步分析java.util.concurrent包的工具類,包括其使用方式、實現源碼及其背後的原理。本文是該系列的第一篇文章,是這系列中最核心的理論部分,之後的文章都會以此為基礎來分析和解釋。



關於java並發編程及實現原理,還可以查閱《Java並發編程:Synchronized及其實現原理》。


一、共享性


數據共享性是線程安全的主要原因之一。如果所有的數據只是在線程內有效,那就不存在線程安全性問題,這也是我們在編程的時候經常不需要考慮線程安全的主要原因之一。但是,在多線程編程中,數據共享是不可避免的。最典型的場景是資料庫中的數據,為了保證數據的一致性,我們通常需要共享同一個資料庫中數據,即使是在主從的情況下,訪問的也同一份數據,主從只是為了訪問的效率和數據安全,而對同一份數據做的副本。我們現在,通過一個簡單的示例來演示多線程下共享數據導致的問題。


二、互斥性


資源互斥是指同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。我們通常允許多個線程同時對數據進行讀操作,但同一時間內只允許一個線程對數據進行寫操作。所以我們通常將鎖分為共享鎖和排它鎖,也叫做讀鎖和寫鎖。如果資源不具有互斥性,即使是共享資源,我們也不需要擔心線程安全。例如,對於不可變的數據共享,所有線程都只能對其進行讀操作,所以不用考慮線程安全問題。但是對共享數據的寫操作,一般就需要保證互斥性,上述例子中就是因為沒有保證互斥性才導致數據的修改產生問題。


C. 求《實戰Java高並發程序設計第二版》全文免費下載百度網盤資源,謝謝~

《實戰Java高並發程序設計第二版》網路網盤pdf最新全集下載:
鏈接: https://pan..com/s/1SUfrgnv_8mlRsYEy_bGMBg

?pwd=ppgv 提取碼: ppgv
簡介:在單核CPU時代,單任務在一個時間點只能執行單一程序,隨著多核CPU的發展,並行程序開發變得尤為重要。本書主要介紹基於Java的並行程序設計基礎、思路、方法和實戰。一,立足於並發程序基礎,詳細介紹Java進行並行程序設計的基本方法。第二,進一步詳細介紹了JDK對並行程序的強大支持,幫助讀者快速、穩健地進行並行程序開發。第三,詳細討論了「鎖」的優化和提高並行程序性能級別的方法和思路。第四,介紹了並行的基本設計模式,以及Java 8/9/10對並行程序的支持和改進。第五,介紹了高並發框架Akka的使用方法。第六,詳細介紹了並行程序的調試方法。第七,分析Jetty代碼並給出一些其在高並發優化方面的例子。本書內容豐富,實例典型,實用性強,適合有一定Java基礎的技術開發人員閱讀。

D. Java並發編程:如何創建線程,進程

在java中如果要創建線程的話,一般有兩種方式:1)繼承Thread類;2)實現Runnable介面。
1.繼承Thread類
繼承Thread類的話,必須重寫run方法,在run方法中定義需要執行的任務。

123456789101112

class MyThread extends Thread{ private static int num = 0; public MyThread(){ num++; } @Override public void run() { System.out.println("主動創建的第"+num+"個線程"); }}

創建好了自己的線程類之後,就可以創建線程對象了,然後通過start()方法去啟動線程。注意,不是調用run()方法啟動線程,run方法中只是定義需要執行的任務,如果調用run方法,即相當於在主線程中執行run方法,跟普通的方法調用沒有任何區別,此時並不會創建一個新的線程來執行定義的任務。public class Test { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); }} class MyThread extends Thread{ private static int num = 0; public MyThread(){ num++; } @Override public void run() { System.out.println("主動創建的第"+num+"個線程"); }}

在上面代碼中,通過調用start()方法,就會創建一個新的線程了。為了分清start()方法調用和run()方法調用的區別,請看下面一個例子:

212223
public class Test { public static void main(String[] args) { System.out.println("主線程ID:"+Thread.currentThread().getId()); MyThread thread1 = new MyThread("thread1"); thread1.start(); MyThread thread2 = new MyThread("thread2"); thread2.run(); }} class MyThread extends Thread{ private String name; public MyThread(String name){ this.name = name; } @Override public void run() { System.out.println("name:"+name+" 子線程ID:"+Thread.currentThread().getId()); }

閱讀全文

與java並發編程例子相關的資料

熱點內容
單片機的功能模塊 瀏覽:771
安卓手機如何錄制視頻長時間 瀏覽:285
安全問題app哪個好 瀏覽:445
壓縮水會變冰嗎 瀏覽:526
小說配音app哪個靠譜 瀏覽:820
編譯iso 瀏覽:944
照片生成pdf格式 瀏覽:194
病歷轉pdf 瀏覽:835
雲伺服器配硬體 瀏覽:978
伺服器10k什麼意思 瀏覽:21
pdfeditor漢化 瀏覽:884
新科學pdf 瀏覽:746
現在還有c語言編譯嗎 瀏覽:675
哪裡買到單片機 瀏覽:480
linux文件打開數量 瀏覽:510
編譯原理中什麼是l屬性文法 瀏覽:372
硬碟加密時出現的問題 瀏覽:61
如何退域命令 瀏覽:108
看書的app哪裡看 瀏覽:291
伺服器怎麼調大 瀏覽:4