Java 線程多線程編程2---線程同步


來模擬一個死鎖(互相等待):

TestDeadLock.java

package com.zhj.www;public class TestDeadLock implements Runnable {public int flag = 1;static Object o1 = new Object();static Object o2 = new Object();public void run() {System.out.println("flag=" + flag);if(flag ==1) {synchronized (o1) {try {Thread.sleep(500);}catch (Exception e) {e.getStackTrace();}synchronized (o2) {System.out.println("1");}}}if(flag ==0) {synchronized (o2) {try {Thread.sleep(500);}catch (Exception e) {e.getStackTrace();}synchronized (o1) {System.out.println("0");}}}}public static void main(String[] args) {TestDeadLock td1 = new TestDeadLock();TestDeadLock td2 = new TestDeadLock();td1.flag = 1;td2.flag = 0;Thread t1 = new Thread(td1);Thread t2 = new Thread(td2);t1.start();t2.start();}}

運行結果:

我們發現程序處于已知等待的情況下。


哲學家吃飯問題(多個線程死鎖):

怎么解決?把鎖的粒度加粗,不如把整個對象鎖住,而不是只是鎖幾行。

粒度:實現數據庫的產品,鎖在行一級還是表一級。

面試題:

package com.zhj.www;
public class TestInterviewQuestion1 implements Runnable {int b =100;public synchronized void m1() {try {b = 1000;Thread.sleep(5000);System.out.println("b = "+b);} catch (Exception e) {e.getStackTrace();}}public void m2() {System.out.println(b);}public void run() {try {m1();}catch (Exception e) {e.getStackTrace();}}public static void main(String[] args) throws Exception{TestInterviewQuestion1 testInterviewQuestion1  = new TestInterviewQuestion1();Thread thread = new Thread(testInterviewQuestion1);thread.start();Thread.sleep(1000);testInterviewQuestion1.m2();}
}

運行結果:
1000
b = 1000

修改一下:

package com.zhj.www;public class TestInterviewQuestion1 implements Runnable {int b =100;public synchronized void m1() {try {b = 1000;Thread.sleep(5000);System.out.println("b = "+b);} catch (Exception e) {e.getStackTrace();}}public synchronized void m2() throws Exception {Thread.sleep(2500);b = 2000;}public void run() {try {m1();}catch (Exception e) {e.getStackTrace();}}public static void main(String[] args) throws Exception{TestInterviewQuestion1 testInterviewQuestion1  = new TestInterviewQuestion1();Thread thread = new Thread(testInterviewQuestion1);thread.start();//Thread.sleep(1000);testInterviewQuestion1.m2();System.out.println(testInterviewQuestion1.b);}
}

對每個方法加不加鎖,要考慮清楚。

互斥:某個時間段,只有一個線程進入這個方法,但不保證不進入另外一個線程。

不允許多個線程同時寫,但允許多個線程讀。


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

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

相關文章

Java網絡編程1---基礎

TCP/IP:事實上的標準 自己編的應用程序:應用層 TCP/UDP層 IP層 物理層 數據封裝:第五層只與第四層打交道。 數據拆封《TCP/IP詳解》網絡底層 IP巨大的貢獻:提供了獨一無二的IP地址。 內網IP:虛假的 子網掩碼:255.255.2…

Java網絡編程2---Socket-TCP編程

Sockct:插座Socket是關于TCP的。 端口號:兩個字節->65536個端口號,一個應用程序占多個端口號; 但是假設一個應用程序占一個端口號;一臺電腦會有65535個應用程序。 自己編寫程序要占用端口號1024以上后的。 80端口:網…

winform綁定多張圖片

開發winform程序的時候經常設計到要顯示多張圖片的問題,其解決思路一般是先遍歷文件夾中的所有圖片,然后再把這些圖片添加到ImageList控件中,最后再綁定顯示出來。這里我們介紹兩種綁定的方法: (一)動態生成…

Java網絡編程3---Socket-UDP編程

栗子:TestUDPServer.java 服務器端: package com.zhj.www;import java.net.DatagramPacket; import java.net.DatagramSocket;public class TestUDPServer {public static void main(String[] args)throws Exception {byte buf[] new byte[1024];Datagr…

iOS 6 自動布局入門

http://www.raywenderlich.com/zh-hans/22873/ios-6-自動布局-入門-1轉載于:https://www.cnblogs.com/ihojin/p/auto-layout.html

Java GUI 基礎知識

這部分主要包含AWT、組件和容器、布局管理器Component:所有可以和用戶交互的圖形元素,他的子類有:輸入框… Java.awt及其子包 Container:容器,容納其他各種各樣的Component的元素。 Panel:可以容納其他元素…

UVA11300

初步解題原理:代數運算單元素極值 代數運算: xi表示第i個給i-1的數量,正負表示給或得 c(a1a2a3....an)/n a1-x1x2c -->x2x1-a1c a2-x2x3c -->x3x1-a1-a22c a3-x3x4c -->x4x1-a1-a2-a33c ...... an-xnx1c -->xnx1-a1-a2-a3....-a(n-1)(n-1)c ansmax{|x1|…

Java GUI 基礎知識2 監聽機制

TestActionEvent.java沒有調用方法,但是有反應。反應自己要編寫程序有反應。 事件模型:一定要有某些反應。 寫程序,監聽的操作是自動發生的,一直監聽。鉤子函數,(回調函數) 怎么讓它自動執行&am…

求字符串的最長回文字串 O(n)

昨天參加了某公司的校園招聘的筆試題,做得慘不忍睹,其中就有這么一道算法設計題:求一個字符串的最長回文字串。我在ACM校隊選拔賽上遇到過這道題,當時用的后綴數組AC的,但是模板忘了沒寫出代碼來。 回頭我把這道題目再…

數據結構 二、向量(接口與實現and可擴容向量)

ADT操作實例:Disordered:顯示出3對逆序緊鄰對。Vector模板類初始有效空間為0;基于復制的構造描述區間:左閉右開 為什么*2?有限時間內不必要為擴容而打斷。 2、可擴充向量左移一位:加一倍

數據庫:mysql 獲取剛插入行id[轉]

我們在寫數據庫程序的時候,經常會需要獲取某個表中的最大序號數, 一般情況下獲取剛插入的數據的id,使用select max(id) from table 是可以的。但在多線程情況下,就不行了。 下面介紹三種方法 (1) getGeneratedKeys()方法: 程序片斷: Connection conn ; …

svn由于連接方在一段時間后沒有正確答復或連接的主機沒有反應連接嘗試失敗...

解決方法,關掉防火墻, service iptables status 查看iptables狀態 service iptables restart iptables服務重啟 service iptables stop iptables服務禁用 轉載于:https://www.cnblogs.com/jiqing9006/p/3347441.html

Android 服務(Service)

一、服務的解釋 服務(Service)是Android中實現后臺運行的解決方案,它適合那些去執行不需要和用戶交互而且還要求長期運行的任務。服務的運行不依賴任何的與任何用戶界面,即使程序被切換到后臺,或者用戶打開了另外一個應…

CenOS 配置C/C++語言

1.下載eclipseCDT組合包。 2.電腦上安裝GCC, G 3.在eclipse上創建一個C project 4. Eclipse CDT功能很強大,安裝完雖然可以編譯運行c程序,但有個問題,就是找不到c標準庫的頭文件,無法打開諸如之類的文件,編…

(數據結構)前綴,后綴以及中綴表達式

中綴表達式(中綴記法) 中綴表達式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處于操作數的中間。中綴表達式是人們常用的算術表示方法。 前綴表達式(前綴記法、波蘭式) 前綴表達式是一種沒有括號的算術表…

Moravec角點檢測算子

Moravec角點檢測算子 Moravec 在1981年提出Moravec角點檢測算子[1],并將它應用于立體匹配。 首先, 計算每個像素點的興趣值, 即以該像素點為中心, 取一個w*w(如:5x5)的方形窗口, 計算0度、45度、90度、135度四個方向灰度差的平方和, 取其中的最小值作為該像素點的興…

java習題-練習1

1、 Given the string, check if it is a palindrome.(回文) Example For inputString "aabaa", the output should becheckPalindrome(inputString) true;For inputString "abac", the output should becheckPalindrome(inputSt…

文件夾生成工具

很簡單的一個小工具,輸入一個字符串,可以為你生成相應的文件夾. 至于有什么用?我公司一個策劃拿一頓飯給我要的. 下載地址: http://pan.baidu.com/s/1d0ewl 轉載于:https://www.cnblogs.com/WhyEngine/p/3350053.html

java中System.exit(1)、System.exit(0)、以及return的區別

System.exit(0)是正常退出程序,而System.exit(1)或者說非0表示非正常退出程序System.exit(status)不管status為何值都會退出程序。 和return 相比有以下不同點:return是回到上一層,而System.exit(status)是回到最上層

(轉載)深入理解Linux中內存管理---分段與分頁簡介

首先,必須要闡述一下這篇文章的主題是Linux內存管理中的分段和分頁技術。 來回顧一下歷史,在早期的計算機中,程序是直接運行在物理內存上的。換句話說,就是程序在運行的過程中訪問的都是物理地址。如果這個系統只運行一個程序&…