⑴ 什麼是java線程死鎖,如何解決死鎖問題
比如有兩個線程執行,線程t1, 線程t2
t1 需要獲取方法A的鎖標志,同時方法A調用了方法B,t1獲取了A的鎖標志,並獲取了B的鎖標志,才能完成執行
同時t2也在執行,t2獲取方法B的鎖標志,方法B調用了方法A,t2也需要獲取兩個方法A,B的鎖標志才能執行完成
當t1 獲取了A方法的鎖標志,同時t2獲取了B方法的鎖標志
那麼t1會等待t2釋放方法B的鎖標志,t2也在等待t1釋放方法A的鎖標志,這樣就形成了死鎖,都在等待....
⑵ 關於JAVA里的加鎖synchronized
1.凡使用synchronized標記的方法復,比如 public synchronized void func1() { .... },則制同時只有一個線程能夠運行這個方法。比如,線程1正在運行func1,則其他線程需要運行func1的話,會卡住,等線程1運行func1結束後,其他線程中,才會有一個幸運兒成功爭取到運行func1的資格,然後這個幸運兒線程開始運行func1。沒有爭取到運行資格的其他線程,會繼續等待。
2.你的例子中,被鎖定的是 方法 m1,而不是屬性b。所以,m1的synchronized加鎖操作,與b沒有半點毛錢關系。
3.要實現你的鎖b想法,其實很簡單。去買一件貞操寶甲來就行了。開玩笑,哈哈。要鎖b,把main方法里的tt.m2()修改為tt.m1()。
4.以後別用「b」作為變數,總覺得怪怪了。也許你現在還沒長大,很單純。但大人的世界裡,「b」是一種不文雅但又對人類的未來有重要作用的東西。建議用cb來代替b。
⑶ java多線程死鎖問題
public class Test520 {//測試類
public static void main(String[] args) {
Test1 t1=new Test1();//構造線程1
Test2 t2=new Test2();//構造線程2
t1.start();//啟動線程1
t2.start();//啟動線程2
}
}
class Test1 extends Thread{//線程類1
public void run() {//線程類1的run方法
synchronized (A.class) {//線程類1獲取A類的鎖
new A().a();//構建A類調用a方法,線程可以執行到這里
synchronized (B.class) {//線程1請求獲取B類的鎖,看後面的代碼我們知道B類的鎖在線程2中,形成死鎖
new B().b();//構造B類,調用b方法,這語句無法執行,因線程1始終無法獲得已被線程2獲得的B類鎖
}
}
}
}
class Test2 extends Thread{//線程類2
public void run() {//線程類2的run方法
synchronized (B.class) {//線程2獲取了B類的鎖,因此線程1無法在調用a方法後獲取B類鎖執行後面的語句
new A().a();//構造A類對象調用a方法,此語句可以執行
synchronized (A.class) {//線程2請求A類鎖,A類鎖此時被線程1持有
new B().b();//如果線程2能夠獲取A類鎖,就能執行這一步,測試知道,無法執行到這句
}
}
}
}
class A{//測試類
public void a() {
System.out.println("a");
}
}
class B{//測試類
public void b() {
System.out.println("b");
}
}
⑷ Java項目中如何實現數據的安全性,比如安全鎖之類的,求代碼
您好,提問者:
1、重要信息進行加密操作。
2、地址欄盡量採用post提交方式。
3、如果涉及多線內程的話,可以使用Synchronized鎖。容
下面例子:
publicclassMain{
publicstaticvoidmain(String[]args){
newThread(newSuo()).start();
newThread(newSuo()).start();
//開啟兩個線程,加鎖之後數據就不會出錯
}
}
classSuoimplementsRunnable{
privatestaticintnum=100;
publicsynchronizedvoidrun(){
while(true){
if(num==0)
break;
else
System.out.println(num--);
}
}
}
⑸ java多線程中,如何給靜態變數(如List)加鎖/同步
使用synchronized關鍵字同步方法就可以了。
public class Foo2 {
private int x = 100;
public int getX() {
return x;
}
//同步方法
public synchronized int fix(int y) {
x = x - y;
System.out.println("線程"+Thread.currentThread().getName() + "運行結束,減少「" + y + "」,當前值為:" + x);
return x;
}
}
⑹ 求解java多線程的死鎖
你這是同步鎖,鎖的是A對象。有線程跟你一樣用 A對象當鎖的時候 ,只會有一條線程 來執行 B。其他線程都得等待。
1.A區域究竟什麼對象可以作為鎖?
對象,類對象。類對象 全局只有一個 比如 A.class ,當有人用到 這個類對象的時候 就會將其鎖住。不讓其他線程進入。
2.是不是我在一個線程中將A這個對象作為鎖,在另一個線程中對A這個對象進行操作,就會發生死鎖?
死鎖的根本原因1)是多個線程涉及到多個鎖,這些鎖存在著交叉,所以可能會導致了一個鎖依賴的閉環;2)默認的鎖申請操作是阻塞的。所以要避免死鎖,就要在一遇到多個對象鎖交叉的情況,就要仔細審查這幾個對象的類中的所有方法,是否存在著導致鎖依賴的環路的可能性。要採取各種方法來杜絕這種可能性。
你這樣 鎖不到的。舉個例子 死鎖 就是 x線程 鎖住了 A對象 然後 調用B對象的方法,y線程 鎖住了B對象調用A對象的方法,兩邊 都在互相嘗試獲取對方的鎖,但是拿不到。因為 x鎖住了A對象。y鎖住了B對象。他們互相拿不到 就叫死鎖。這只是個例子還有很多。
3不是說任何對象都可以作為一把鎖嗎?那麼每一個鎖我使用一個獨立的成員對象作為鎖,不就是可以很容易避開死鎖嗎?為什麼說死鎖很容易發生?
你每個鎖用一個獨立的成員對象作為鎖,沒問題,只要沒有存在交叉。上面那個例子一樣。
避免死鎖是一件困難的事,遵循以下原則有助於規避死鎖:
1、只在必要的最短時間內持有鎖,考慮使用同步語句塊代替整個同步方法;
2、盡量編寫不在同一時刻需要持有多個鎖的代碼,如果不可避免,則確保線程持有第二個鎖的時間盡量短暫;
3、創建和使用一個大鎖來代替若干小鎖,並把這個鎖用於互斥,而不是用作單個對象的對象級別鎖;