實現賣票案例出現了執行緒安全問題,賣出了不存在和重複的票
解決執行緒安全的第一種方法:使用同步**塊
格式:synchronized(鎖物件)
注意:1.同步**塊中的鎖物件,可以使用任意物件
2.但是必須保證多個執行緒使用的鎖物件是同乙個
3.鎖物件作用:把同步**塊鎖住,只讓乙個執行緒在同步**塊中執行
原理總結:同步的執行緒,沒有執行完畢不會釋放鎖,同步外的執行緒沒有鎖進不去同步
例:
public
class
runnableimpl
implements
runnable
catch
(interruptedexception e)
//賣票
system.out.
println
(thread.
currentthread()
.getname()
+"-->正在賣第"
+ticket+
"張票");
ticket--;}
}}}}
2.解決執行緒安全的第二種方法:使用同步方法
使用步驟:
1.把訪問了共享資料的**抽取出來,放到乙個方法中
2.在方法上新增乙個synchronized修飾符
格式:定義方法的格式
修飾符 synchronized 返回值型別 方法名(引數列表)
原理:同步方法也會把方法內部的**鎖住,只讓乙個執行緒執行,同步方法的鎖物件就是實現類物件new runnableimpl,也就是this
例:
public
class
runnableimpl
implements
runnable
}//定義乙個同步方法
public
synchronized
void
payticket()
catch
(interruptedexception e)
//賣票
system.out.
println
(thread.
currentthread()
.getname()
+"-->正在賣第"
+ ticket +
"張票");
ticket--;}
}}
解決執行緒安全的第三種方法:使用lock鎖
使用步驟:
1.在成員位置建立乙個reentrantlock物件
2.在可能會出現執行緒安全問題的**前呼叫lock介面中的方法lock獲取鎖
3.在可能會出現執行緒安全問題的**後呼叫lock介面中的方法unlock釋放鎖
例:
public
class
runnableimpl2
implements
runnable
catch
(interruptedexception e)
finally}}
}}
AppScan安全問題解決方案
一 環境準備 三 高危常見問題解決方案 1.sql盲注 主要就是通過注入sql的關鍵字,來破壞原有的查詢,導致頁面報錯 a.看看幾種常見的盲注方式 b.解決方案 思路 sql注入與sql盲注實際的攻入方式不同,但是解決思路都是通過過濾特殊字元,只是過濾的字元稍有差異。實際解決 從以上幾種注入可以看出...
Ajax跨域安全問題解決方案
伺服器方解決方案 一 建立filter解決 1.獲取請求的httpservletresponse response及httpservletrequest request 2.獲取請求頭中的 origin access control allow headers 3.設定請求頭引數 設定請求域 acc...
物件發布和初始化時的執行緒安全問題解決方案
我們來看方法返回乙個private物件的這種情況 public class unsafestates public string getstates 如果按照上述方式來發布states,就會出現問題。因為任何呼叫者都能修改這個陣列的內容。在這個示例中,陣列states已經逸出了它所在的作用越,因為這...