資料有負數,相同的情況
比如在進行搶票的時候。可能會出現在第資料不準確的現象
public
class
unsafe
implements
runnable}}
public
static
void
test()
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"--->"
+ticketnum--);
}public
static
void
main
(string[
] args)
}
在訪問時加入鎖機制。當乙個執行緒獲得物件的排他鎖,獨佔資源,其他執行緒必須等待
修改之後的**
public
class
synblock
implements
runnable
}//盡可能鎖定合理的範圍。
//雙重檢測,主要是為了確定臨界值的情況
public
void
test3()
//當多個執行緒執行到此處時,臨界值1,只有乙個執行緒進入同步塊,其他的執行緒在外面等待,當進去的執行緒執行到
//ticketnum--,所以ticketnum就為0,外面等待的就可以直接return,從而提高了效能。
synchronized
(this
)try
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"--->"
+ticketnum--);
}}//同步塊。
//因為我們需要判斷的是ticketnum和flag,但是鎖物件只能是乙個
//所以向上找,即是synblock,所以就是this
//不可以單獨鎖ticketnum不行,因為ticketnum是乙個會變的,因此鎖不住
//在進行給物件加鎖時,要鎖的物件是乙個不變的量。
public
void
test2()
trycatch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"--->"
+ticketnum--);
}}//同步方法
//執行緒安全,同步
//成員方法所得就是this,就是呼叫該方法的物件。
//鎖的是this物件的資源。
public
synchronized
void
test1()
trycatch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"--->"
+ticketnum--);
}public
static
void
main
(string[
] args)
}
執行緒安全與執行緒同步
執行緒安全 可重入函式 執行緒之間共享全域性資料段 靜態資料,引起非執行緒安全。執行緒安全可以通過執行緒同步對臨界資源訪問進行控制來實現。有些系統呼叫或者庫函式的實現時發生不安全現象,在多執行緒環境下就需要使用這些函式的安全版本,即可重入函式。例如 字串分割函式 普通版本 char strtok c...
執行緒同步 執行緒安全
1 執行緒同步 1 同步 多程序或者多執行緒訪問臨界資源時,必須進行同步控制。多程序或者多執行緒的執行並不完全是絕對的並行執行,有可能主線程需要等待函式執行緒的某些條件的發生。2 多執行緒之間有幾個特殊的臨界資源 全域性資料 堆區資料 檔案描述符 多執行緒之間共用 3 執行緒間同步控制方式 a.訊號...
執行緒同步和執行緒安全
執行緒同步,嚴格來說,是程式通過專用的機制來保證多個並行執行的執行緒在同一時刻不會執行指定的程式段。的執行緒安全,指的是多執行緒以安全執行的方式操作共享資料結構。或者簡單的說,就是程式在多執行緒環境下執行而不會引發資料錯誤。有多種策略實現執行緒安全的資料結構。執行緒同步是現實執行緒安全的一種手段。不...