java中多執行緒的安全問題以及解決辦法

2021-06-29 05:44:36 字數 2389 閱讀 6042



publicstaticvoidmain(string args)

publicstaticvoidshow()

publicclas******mentsrunnable

privateint

ticket

=100;

publicvoidrun()catch(interruptedexception e)

system.

out.println(

"name:"

+name

+":"

+(ticket

--)); }

} }

擷取部分結果:

name:ljf1:16

name:ljf1:15

name:ljf1:14

name:ljf1:13

name:ljf1:12

name:ljf1:11

name:ljf1:10

name:ljf1:9

name:ljf1:8

name:ljf1:7

name:ljf1:6

name:ljf1:5

name:ljf1:4

name:ljf1:3

name:ljf1:2

name:ljf1:1

name:ljf1:0

name:ljf1:-1

name:ljf1:-2

1

原因:多條語句來操作同一執行緒的共享資源時,乙個執行緒對多條語句只執行了一部分,還沒有執行完,另外乙個執行緒參與來執行,導致共享資源的錯誤。

解決的辦法:使用同步**塊。

解決的辦法:使用同步**塊。

synchronized(

同步物件

)

加鎖修改之後:

publicclas******mentsrunnable

privateint

ticket

=100;

objectobj=newobject();

publicvoidrun()catch(interruptedexception e)

system.

out.println(

"name:"

+name

+":"

+(ticket

--)); }

} }}

總結:物件如同鎖,持有鎖的執行緒可以在同步中執行,沒有持有鎖的執行緒即使獲取

cpu的執行權也進不去。

同步的前提:

1.必須要有兩個或者兩個以上的執行緒。

2必須是多個執行緒使用同乙個鎖。必須保證同步中只能有乙個執行緒在執行。

好處:解決了多執行緒的安全問題。

弊端:多個執行緒需要判斷鎖,較為消耗資源。 2.

第二種方式:使用同步函式:

函式都需要被物件呼叫,函式都有乙個所屬物件的引用,

this

同步函式所使用的鎖是

this;

出現不和諧的情況:

ljf>>100.

. .ljf>>12

ljf>>11

ljf>>13

ljf>>10

ljf>>9

ljf>>8

ljf>>7

ljf>>6

ljf>>5

ljf>>2

ljf>>3

ljf>>4

ljf>>1

ljf>>-2

ljf>>-1

ljf>>0

給方法加上同步修飾符,使其變為同步函式:

結果為:

ljf>>9

ljf>>8

ljf>>7

ljf>>6

ljf>>5

ljf>>4

ljf>>3

ljf>>2

ljf>>1

java程序 執行緒 多執行緒以及執行緒安全問題

程序 程序是處在執行的程式 執行緒 程序裡任務的執行路徑 多執行緒 乙個程序裡有多個執行緒可以執行多個任務 執行緒安全問題 先看乙個售票例子 public class main class selltickets extends thread override public void run els...

Java多執行緒4 安全問題

這樣的執行機制就可能會導致多執行緒的安全問題 1.多個執行緒操作共享資料 2.在乙個執行緒中有多行 操作共享資料 改變共享資料 解決思路 乙個執行緒在執行執行緒任務的時候將多條操作共享資料的 一起執行,在執行過程中不允許其他執行緒執行 體現 package thread class tickets ...

多執行緒中的執行緒安全問題

問題描述 某段 在沒有執行完成的時候,cpu就可能被其他執行緒搶走,結果導致當前 中的一些資料發生錯誤 原因 沒 某段 的執行的完整性 原子性 希望 這段 要麼全都執行,要麼全都沒有執行 前面模擬售票的都是執行緒安全問題 同步 塊 使用一種格式,達到讓某段 執行的時候,cpu不要切換到影響當前 的 ...