併發 二 執行緒安全問題

2021-08-28 02:34:59 字數 1954 閱讀 9639

一 執行緒安全

如圖示執行緒的工作記憶體與主記憶體的區別。加了violate關鍵字以後,就能保證執行緒記憶體中的變數及時回寫。但是這種情況一般適用於低併發,並且記憶體操作不涉及底層機器指令操作的情況下。對於如下所示的**

public class thread***lite 

}}public static void main(string args) throws interruptedexception

@override

public void run()

} }public static void main(string args) throws interruptedexception

}} }

public static void main(string args) throws interruptedexception

@override

public void run()

}} }

public static void main(string args) throws interruptedexception

}} }

public static void main(string args) throws interruptedexception

} public static synchronized void methodb(){}

}

如上**所示,如果乙個地方正在使用這個類,那麼其他地方就不能夠再使用這個類了。這就是類級別的鎖。然而方法

a,與b就是互斥的。也就是說這兩種寫法都是類鎖的寫法。

1.3.2 物件鎖

class threadeg 

} public synchronized void methodb(){}

}

如上所示的物件加鎖方法就是物件鎖,乙個類可以有多個例項,然而多個例項直接各自呼叫各自的方法是不會影響的,但是如上所示加了物件鎖之後,那麼這個例項是不可以對同時呼叫

a與b方法的,這兩個方法是同步的。但是如果是兩個例項的話,這兩個方法就是非同步的。如果兩個例項要實現同步,那麼就得把鎖上公升到類鎖。

1.3.3 變數鎖

class threadeh 

} public void methodb()

} }

如上**所示,是通過變數來實現,a,b方法的同步的,然而這樣的同步其實也是物件鎖的特例。它無非還是讓物件的a,b兩個方法不能同時執行。那麼上面的index++問題,大家應該知道怎麼處理了吧。那就是類鎖來解決。

1.4.1併發下的arraylist

public class threadarraylist 

} }

public static void main(string args)

}

如上**所示,可能你覺得這段**會輸出

20000個數,然而結果是什麼

1.4.2併發下的hashmap

高併發執行緒安全問題

高併發執行緒 1 當多個執行緒訪問同乙個共享物件時,就是高併發執行緒。如,天貓雙十一等。因為執行緒的排程是搶占式的,當乙個執行緒在訪問共享資料 可以是多行 也可以是成員變數 時,其他執行緒也參與了該共享資料的運算,就會造成資料汙染,即執行緒安全 a 可見性 當多條執行緒在運算同一共享資料時,某條執行...

併發安全問題

守護程序是指乙個程序守護另乙個程序 例如a是b的守護程序b如果結束了a也會隨之結束 def task name print s is running name time.sleep 3 if name main obj process target task,args egon obj.daemon...

Java併發程式設計 執行緒安全問題

1.執行緒安全的概念 當多個執行緒訪問某乙個類 物件或方法 時,這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的.synchronized 可以在任意物件或方法上加鎖,而加鎖的這段 稱為 互斥區 或 臨界區 示例 package com.thread.safety 執行緒安全...