java多執行緒值執行緒同步

2021-07-09 02:33:49 字數 1435 閱讀 9173

在多執行緒的操作中,多個執行緒有可能同時處理同一資源,這就是多執行緒的共享資料。

如下程式:

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...