Android(java)學習筆記10:同步中的死鎖問題以及線程通信問題

1. 同步弊端:

(1)效率低

(2)如果出現了同步嵌套,就容易產生死鎖問題

死鎖問題及其代碼 :

(1)是指兩個或者兩個以上的線程在執行的過程中,因爭奪資源產生的一種互相等待現象

(2)同步代碼塊的嵌套案例

1 package cn.itcast_02;
2 
3 public class MyLock {
4     // 創建兩把鎖對象
5     public static final Object objA = new Object();
6     public static final Object objB = new Object();
7 }
 1 package cn.itcast_02;
 2 
 3 public class DieLock extends Thread {
 4 
 5     private boolean flag;
 6 
 7     public DieLock(boolean flag) {
 8         this.flag = flag;
 9     }
10 
11     @Override
12     public void run() {
13         if (flag) {
14             synchronized (MyLock.objA) {
15                 System.out.println("if objA");
16                 synchronized (MyLock.objB) {
17                     System.out.println("if objB");
18                 }
19             }
20         } else {
21             synchronized (MyLock.objB) {
22                 System.out.println("else objB");
23                 synchronized (MyLock.objA) {
24                     System.out.println("else objA");
25                 }
26             }
27         }
28     }
29 }
 1 package cn.itcast_02;
 2 
 3 /*
 4  * 同步的弊端:
 5  *         A:效率低
 6  *         B:容易產生死鎖
 7  * 
 8  * 死鎖:
 9  *         兩個或兩個以上的線程在爭奪資源的過程中,發生的一種相互等待的現象。
10  * 
11  * 舉例:
12  *         中國人,美國人吃飯案例。
13  *         正常情況:
14  *             中國人:筷子兩支
15  *             美國人:刀和叉
16  *         現在:
17  *             中國人:筷子1支,刀一把
18  *             美國人:筷子1支,叉一把
19  */
20 public class DieLockDemo {
21     public static void main(String[] args) {
22         DieLock dl1 = new DieLock(true);
23         DieLock dl2 = new DieLock(false);
24 
25         dl1.start();
26         dl2.start();
27     }
28 }

我們執行的時候會發現程序會鎖住(當然這個只是很大幾率會鎖住):如下圖

這里死鎖我們該怎么解決呢?這里引出了線程之間通信:

?

不同種類的線程針對同一個資源的操作

?

?

?

?

2. 下面設置線程(生產者)和獲取線程(消費者針對同一個學生對象進行操作示例:

代碼實現:

 1 package cn.itcast_03;
 2 
 3 /*
 4  * 分析:
 5  *         資源類:Student    
 6  *         設置學生數據:SetThread(生產者)
 7  *         獲取學生數據:GetThread(消費者)
 8  *         測試類:StudentDemo
 9  * 
10  * 問題1:按照思路寫代碼,發現數據每次都是:null---0
11  * 原因:我們在每個線程中都創建了新的資源,而我們要求的時候設置和獲取線程的資源應該是同一個
12  * 如何實現呢?這里是共享資源一種思路
13  *         在外界把這個數據創建出來,通過構造方法傳遞給其他的類。
14  * 
15  */
16 public class StudentDemo {
17     public static void main(String[] args) {
18         //創建資源----外界創建出資源
19         Student s = new Student();
20         
21         //設置和獲取的類(這兩個線程類被剛剛創建的資源綁定)
22         SetThread st = new SetThread(s);//通過構造方法傳遞給其他類
23         GetThread gt = new GetThread(s);//通過構造方法傳遞給其他類
24 
25         //線程類
26         Thread t1 = new Thread(st);
27         Thread t2 = new Thread(gt);
28 
29         //啟動線程
30         t1.start();
31         t2.start();
32     }
33 }

?

 1 package cn.itcast_03;
 2 
 3 public class SetThread implements Runnable {
 4 
 5     private Student s;
 6 
 7     public SetThread(Student s) {
 8         this.s = s;
 9     }
10 
11     @Override
12     public void run() {
13         // Student s = new Student();
14         s.name = "林青霞";
15         s.age = 27;
16     }
17 
18 }

?

 1 package cn.itcast_03;
 2 
 3 public class GetThread implements Runnable {
 4     private Student s;
 5 
 6     public GetThread(Student s) {
 7         this.s = s;
 8     }
 9 
10     @Override
11     public void run() {
12         // Student s = new Student();//上面SetThread()類中run()方法也出現Student s = new Student(),這樣就出現兩個不同的對象
13         System.out.println(s.name + "---" + s.age);
14     }
15 
16 }

?

1 package cn.itcast_03;
2 
3 public class Student {
4     String name;
5     int age;
6 }

上面代碼是有問題的,如下:

?

進一步改進上面代碼:

 1 package cn.itcast_04;
 2 
 3 /*
 4  * 分析:
 5  *         資源類:Student    
 6  *         設置學生數據:SetThread(生產者)
 7  *         獲取學生數據:GetThread(消費者)
 8  *         測試類:StudentDemo
 9  * 
10  * 問題1:按照思路寫代碼,發現數據每次都是:null---0
11  * 原因:我們在每個線程中都創建了新的資源,而我們要求的時候設置和獲取線程的資源應該是同一個
12  * 如何實現呢?
13  *         在外界把這個數據創建出來,通過構造方法傳遞給其他的類。
14  * 
15  * 問題2:為了數據的效果好一些,我加入了循環和判斷,給出不同的值,這個時候產生了新的問題
16  *         A:同一個數據出現多次
17  *         B:姓名和年齡不匹配
18  * 原因:
19  *         A:同一個數據出現多次
20  *             CPU的一點點時間片的執行權就足夠你執行很多次21  *         B:姓名和年齡不匹配
22  *             線程運行的隨機性
23  * 線程安全問題:
24  *         A:是否是多線程環境        是
25  *         B:是否有共享數據        是
26  *         C:是否有多條語句操作共享數據    是
27  * 解決方案:
28  *         加鎖。
29  *         注意:
30  *             A:不同種類的線程都要加鎖31  *             B:不同種類的線程加的鎖必須是同一把32  */
33 public class StudentDemo {
34     public static void main(String[] args) {
35         //創建資源
36         Student s = new Student();
37         
38         //設置和獲取的類
39         SetThread st = new SetThread(s);
40         GetThread gt = new GetThread(s);
41 
42         //線程類
43         Thread t1 = new Thread(st);
44         Thread t2 = new Thread(gt);
45 
46         //啟動線程
47         t1.start();
48         t2.start();
49     }
50 }

?

 1 package cn.itcast_04;
 2 
 3 public class SetThread implements Runnable {
 4 
 5     private Student s;
 6     private int x = 0;
 7 
 8     public SetThread(Student s) {
 9         this.s = s;
10     }
11 
12     @Override
13     public void run() {
14         while (true) {
15             synchronized (s) {
16                 if (x % 2 == 0) {
17                     s.name = "林青霞";//剛走到這里,就被別人搶到了執行權
18                     s.age = 27;
19                 } else {
20                     s.name = "劉意"; //剛走到這里,就被別人搶到了執行權
21                     s.age = 30;
22                 }
23                 x++;
24             }
25         }
26     }
27 }

?

 1 package cn.itcast_04;
 2 
 3 public class GetThread implements Runnable {
 4     private Student s;
 5 
 6     public GetThread(Student s) {
 7         this.s = s;
 8     }
 9 
10     @Override
11     public void run() {
12         while (true) {
13             synchronized (s) {
14                 System.out.println(s.name + "---" + s.age);
15             }
16         }
17     }
18 }

?

1 package cn.itcast_04;
2 
3 public class Student {
4     String name;
5     int age;
6 }

?

?

轉載于:https://www.cnblogs.com/hebao0514/p/4509803.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257285.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257285.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257285.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4源代碼的下載和編譯

1、Android移植主要就是Linux內核移植,而Linux內核移植主要是Linux驅動移植,為了開發和測試Linux驅動,要在Ubuntu下搭建兩套開發環境:Android應用程序開發環境和Linux內核開發環境; 2、Android源代碼包括:內…

在html中三個圖片切換,輕松搞定網頁中的圖片切換

生活中經常看到,像新浪等很多門戶網站的首頁都有滾動圖片的展示,如下圖所示:某網站首頁滾動切換圖片這樣不但可以減少文字的單一、乏味,而且可以直觀內容,更好的吸引用戶。那在我們做軟件系統時,是否也可以…

python 進程編程速成

python具有thread多線程庫,但多線程并不是真正的多線程,不能充分利用多核CPU資源。 在大多數情況下,python可以使用multiprocessing多進程庫,可以輕松完成從單進程到并發執行的轉換。 multiprocessing庫支持子進程、通信和共享數據…

requirejs(shim)處理加載非AMD規范的js庫

使用requirejs加載模塊,模塊的定義得遵守AMD規范,也即定義模塊的時候使用如下函數定義模塊: 1 define(function(){ 2 var private function(){ 3 console.log(私有方法...); 4 }; 5 return { 6 public:funct…

關于常用meta的總結

入行也半年了,無數次的想過寫博客也無數次的想過第一篇會寫什么,一直沒有落實。今天心血來潮把博客開了,那就寫點東西吧。第一篇就寫一寫看似簡單但又經常不注意到的meta標簽吧。(博主經驗尚淺,有許多理解不到位的地方…

計算機應用基礎18春在線作業1答案,東師計算機應用基礎-18春在線作業1.docx

東師計算機應用基礎18春在線作業11、A 2、C 3、C 4、C 5、B一、單選題共25題,62.5分1、國際區位、全拼雙音、五筆字型和自然碼是不同種類的漢字A外碼B內碼C字型碼D交換碼正確答案是:A2、漢字字形碼的使用是在____A輸入時B內部傳送時C輸出時D兩臺計算機之…

jQuery Validate 驗證,校驗規則寫在控件中的具體例子

將校驗規則寫到控件中 <script src"../js/jquery.js" type"text/javascript"></script> <script src"../js/jquery.validate.js" type"text/javascript"></script> <script src"./js/jquery.metadata…

在oracle中使用Trigger

1、初始目標 在對表h1插入一條數據時&#xff0c;同時插入一條重復的數據&#xff08;只有主鍵不同&#xff09; 2、在PL/SQL里New一個Trigger或者手動敲入代碼 先說明一下&#xff0c;表h1包括4列ID、C1、C2、C3 create or replace trigger Trigger_Testafter insert on h1for…

html突出顯示,javascript-記住html頁面中突出顯示的文本(向html頁面添加注釋)

我有一個HTML文件,我正在用webkit打開它,我想開發一個應用程序,這樣,在打開它之后,我應該能夠選擇一些文本并將其突出顯示(例如,按下“ highlight text”按鈕).并且它應該記住突出顯示的文本,以便下次打開時應自動突出顯示相同的文本…要存儲哪些信息,以便下次可以突出顯示相同…

cygwin

根據cygwin user guide翻譯整理&#xff0c;希望對大家有所幫助。有錯誤清指出。 1 引言 cygwin是一個在windows平臺上運行的unix模擬環境&#xff0c;是cygnus solutions公司開發的自由軟件&#xff08;該公司開發了很多好東西&#xff0c;著名的還有eCos&#xff0c;不…

JAVA wait(), notify(),sleep具體解釋

在CSDN開了博客后&#xff0c;一直也沒在上面公布過文章&#xff0c;直到前一段時間與一位前輩的對話&#xff0c;才發現技術博客的重要&#xff0c;立志要把CSDN的博客建好。但一直沒有找到好的開篇的主題&#xff0c;今天再看JAVA線程相互排斥、同步的時候又有了新的體會&…

通過鍵盤上下鍵 JS事件,控制候選詞的選擇項

效果圖 JS代碼 //上下鍵 選擇事件 searchBackgroud 為樣式&#xff0c;只做標記&#xff0c;無實質樣式&#xff0c;因為和其他樣式不兼容&#xff0c;只能添加CSS$(document).keydown(function (event) {var upDownClickNum $("#SearchTips .searchBackgroud ").l…

物理競賽得獎學計算機,物理競賽林紫琪帶你探索清華學堂計算機科學實驗班”(姚班)...

林紫琪&#xff0c;34屆全國中學生物理競賽全國第22名&#xff0c;獲得女生最高分&#xff0c;入選國家集訓隊&#xff0c;現就讀于清華姚班。這是一條小科普&#xff1a;“清華學堂計算機科學實驗班”(姚班)由世界著名計算機科學家姚期智院士于2005年創辦&#xff0c;致力于培…

Jmeter===Jmeter中使用CSV Data Set Config參數化不重復數據執行N遍(轉)

Jmeter中使用CSV Data Set Config參數化不重復數據執行N遍 要求&#xff1a; 今天要測試上千條數據&#xff0c;且每條數據要求執行多次&#xff0c;&#xff08;模擬多用戶多次抽獎&#xff09; 1.用戶id有175個&#xff0c;且沒有任何排序規則&#xff1b; 2.要求175個用戶都…

[轉]wireshark 實用過濾表達式(針對ip、協議、端口、長度和內容) 實例介紹

首先說幾個最常用的關鍵字&#xff0c;“eq” 和 “”等同&#xff0c;可以使用 “and” 表示并且&#xff0c;“or”表示或者。“!" 和 "not” 都表示取反。 一、針對wireshark最常用的自然是針對IP地址的過濾。其中有幾種情況&#xff1a; &#xff08;1&#xff0…

[Flexbox] Using order to rearrange flexbox children

Using the order property we alter the order in which flexbox children appear on the page, without making changes to the dom. Desktop Mobile 轉載于:https://www.cnblogs.com/Answer1215/p/5453671.html

計算機怎么更改用戶頭像像,Win10系統電腦賬戶頭像怎么改成系統默認狀態?

為了保護電腦的安全&#xff0c;我們可以設置登錄賬號密碼&#xff0c;而賬號的頭像也是可以自行更換的。但是&#xff0c;某些時候&#xff0c;因為一些原因&#xff0c;我們需要將Win10系統賬戶的頭像去掉&#xff0c;即改成默認狀態。但是很多人都不清楚該怎么操作&#xff…

SPFA模板

今天去聽2015ZJOI浙江省隊第二試的集訓&#xff0c;早上就是聽得云里霧里的ORZ&#xff0c;下午某兩集訓隊大神過來將題目&#xff0c;第一個進了IOI的我只聽懂了10%ORZ&#xff0c;第二個人機交互很好玩&#xff0c;找個時間單獨寫下。 順便附帶膜拜各位聚聚&#xff0c;保我明…

LCM在Kernel中的代碼分析

lcm的分析首先是mtkfb.c 1.mtk_init中platform_driver_register(&mtkfb_driver)注冊平臺驅動 panelmaster_init(); DBG_init(); mtkfb_ipo_init(); 2.mtkfb_probe進行普配 3.然后執行primary_display_init(mtkfb_find_lcm_driver(),lcd_fps); 4.mtkfb_find_lcm_driver()進行…

html ascii編碼方式,HTML 字符集 參考手冊

要正確顯示一個 HTML 頁面&#xff0c;瀏覽器必須知道要使用的字符集(字符編碼)。HTML 字符集在 HTML 中&#xff0c;正確的字符編碼是什么&#xff1f;HTML5 中默認的字符編碼是 UTF-8。這并非總是如此。早期網絡的字符編碼是 ASCII 碼。后來&#xff0c;從 HTML 2.0 到 HTML …