Java非執行緒安全問題的解決方法

2021-09-25 04:47:03 字數 1438 閱讀 9114

在上節《多執行緒之間訪問例項變數》**現了乙個術語——非執行緒安全。非執行緒安全主要是指多個執行緒對同乙個物件中的同乙個例項變數進行操作時會出現值被更改、值不同步的情況,進而影響程式的執行流程。下面用乙個示例來學習一下如何解決非執行緒安全問題。

本案例模擬了多執行緒下的使用者登入驗證功能。首先編寫乙個類實現驗證功能, logincheck 類的**如下:

package ch14;

public class logincheck

password=_password;

system.out.println("username="+username+"password="+password);

}catch(interruptedexception e)}}

接下來建立執行緒類 loginthreada 和 loginthreadb,這兩個執行緒都呼叫 logincheck 類進行登入資訊。其中 loginthreada 類的**如下:

package ch14;

public class loginthreada extends thread

}loginthreadb 類的**如下:

package ch14;

public class loginthreadb extends thread

}現在編寫主線程程式,分別建立 loginthreada 執行緒例項和 loginthreadb 執行緒實現,然後啟動這兩個執行緒。主線程的**如下:

package ch14;

public class test07

}程式執行後的結果如下所示:

username=root password=admin

username=root password=root

從執行結果中可以看到使用者名稱 root 出現了這兩次,這是由於多個執行緒同時修改 username,導致值不一致的情況。

仔細檢視**可以發現問題出現在兩個執行緒都會呼叫 dopost() 方法上。解決這個非執行緒安全問題的方法是使用 synchronized 關鍵字修飾 dopost() 方法,即不允許多個執行緒同時修改 dopost() 方法中的變數。更改**如下:

package ch14;

public class logincheck

password=_password;

system.out.println("username="+username+"password="+password);

}catch (interruptedexception e)}}

再次執行主線程,此時將看到如下所示的結果,說明不存在「非執行緒安全」問題了。

username=admin password=admin

username=root password=root

解決執行緒安全問題

一 1 同步 塊 解決runnable的執行緒安全問題 格式 synchronized 同步監視器 被同步的 操作共享資料的 共享資料 多個執行緒共同操作的變數 同步監視器 俗稱鎖,任何乙個類的物件都可以充當鎖。同步監視器中可以用this充當鎖 2 解決繼承thread類的執行緒安全問題 synch...

解決執行緒的安全問題

synchronized的底層是使用作業系統的mutex lock實現的。1.作為方法的修飾符 方法的定義前面synchronized intadd int a,int b synchronized static intadd int a,int b 2.作為同步 塊synchronized 物件的...

什麼是執行緒安全問題 及怎麼解決執行緒安全問題

1.什麼是執行緒安全問題 就是 多執行緒環境中 且存在資料共享 乙個執行緒訪問的共享 資料被其他執行緒修改了,那麼就發生了執行緒安全問題 整個訪問過程中 無一共享的資料被其他執行緒修改了 就是執行緒安全的 程式中如果使用成員變數,且對成員變數進行資料修改 就存在資料共享問題,也就是執行緒安全問題 2...