在多執行緒的操作中,多個執行緒有可能同時處理同一資源,這就是多執行緒的共享資料。
如下程式:
public class threaddemo catch (interruptedexception e) catch (interruptedexception e) catch (interruptedexception e) {
e.printstacktrace();
system.out.println(thread.currentthread().getname()+"用完印表機
");
同步帶來的問題:
同步是以降低程式的執行效率作為代價的,為了減少執行緒安全所帶來的負面影響可採用如下措施:
1:不要對執行緒安全類的所有方法都進行同步,只對那些會改變競爭資源的方法進行同步,
如果可變類有兩種執行環境,單執行緒和多執行緒兩種環境,則應該提供兩種版本,即單執行緒不安全版和多執行緒安全版,在單執行緒中提供不安全版提高效能,在多執行緒環境下使用安全版。
jdk所提供的
stringbuffer
和stringbuilder
就是為單執行緒環境和多執行緒提供環境的類,單執行緒環境使用
stringbuilder
提高效能,多執行緒環境下使用
stringbuffer
提高保證安全。
釋放同步監視器的鎖定:
任何**進入同步**塊,同步方法之前,必須先獲得對同步監視器的鎖定,當修改完後就會釋放鎖,但是程式無法顯示的釋放監視器的鎖定,執行緒會在下情況下釋放鎖:
(1):當前執行緒的同步方法,**塊結束,立即釋放鎖。 (2
):當前執行緒在同步**塊,或方法中遇到
break
或return方法
(3):當前執行緒在同步**塊,或方法中出現了未處理的error
或exceoption
導致了該**塊,該方法異常結束。
(4):當前執行緒在同步**塊,或方法時,程式執行了同步監視器物件的wait
(),則當前執行緒暫停,並釋放同步監視器。
如下情況執行緒不會釋放同步***:
1:執行緒執行同步**或同步方法的時候,程式呼叫
thread.sleep () or thread.yield ()
方法暫停當前程式,當前執行緒不會釋放同步監視器。
2:執行緒執行同步**塊時,其他執行緒呼叫了該執行緒
supspend
()方法將該執行緒掛起。該執行緒不會釋放同步監視器。
當編寫synchronized
塊時,有幾個簡單的準則可以遵循,這些準則在避免死鎖和效能危險方面大有幫助。
使用同步有如下準則:
1:使**塊保持簡短,把不隨執行緒變化的預處理和後處理移出
synchronized塊
2:不要阻塞。
3:在持有鎖的時候,不要對其它物件呼叫方法。(如果呼叫同步物件有可能出現死鎖)
JAVA多執行緒同步
1.同步 塊 synchronized 物件 例程 package cn.wf.thread1 多執行緒同步 同步 塊 author wf public class thread test class thread01 implements runnable trycatch interrupted...
java多執行緒 同步
2019獨角獸企業重金招聘python工程師標準 synchronized關鍵字鎖的物件可以是方法 變數 類和當前例項。synchronized不能被繼承,子類將自動去除synchronized關鍵字 public synchronized void 變為public void 方法public s...
Java多執行緒(四) 協調同步執行緒
當乙個執行緒使用的同步方法中用到的某個變數,而此變數又需要其他執行緒修改才能符合本執行緒的需要,那麼可以再同步方法中使用wait 方法。使用wait 方法時正確的模板是將鎖放置在while 迴圈中。package test public class tickethome implements run...