java同步方法,java同步方法和同步代碼塊的區別

本文目錄一覽:

java中實現同步的方法有哪兩種?

Java的同步可以用synchronized關鍵字來實現。\x0d\x0a \x0d\x0asychronized可以同步代碼,需要綁定一個對象,如synchronized(obj){}\x0d\x0a也可以同步一個方法,是對方法進行線程同步。如public void synchronized methodA(){}

java中線程同步的幾種方法

線程同步主要有以下種方法(示例中是實現計數的功能):

1、同步方法,即使用synchronized關鍵字修飾方法,例如:

public synchronized void add(int c){…}

2、同步代碼塊,即有synchronized關鍵字修飾的語句塊,例如:

public void addAndGet(int c){

    synchronized(this){

      count += c;

    }

}

3、使用特殊域變數(volatile)實現線程同步,該方法不能保證絕對的同步。

例如:private volatile int count = 0;

4、使用鎖實現線程同步,例如:

private Lock lock = new ReentrantLock();

  public void add(int c) {  

        lock.lock();//上鎖  

        try{  

            count += c;  

        }finally{  

            lock.unlock();//解鎖  

        }  

    }

5、使用原子變數實現線程同步,在java的util.concurrent.atomic包中提供了創建了原子類型變數的工具類,例如:

private AtomicInteger count= new AtomicInteger(1);

public void add(int c) {

    count.addAndGet(c);

}

6、使用局部變數實現線程同步,如果使用ThreadLocal管理變數,則每一個使用該變數的線程都獲得該變數的副本, 副本之間相互獨立,這樣每一個線程都可以隨意修改自己的變數副本,而不會對其他線程產生影響。

ThreadLocal 類的常用方法

new ThreadLocalT() : 創建一個線程本地變數

get() : 返回此線程局部變數的當前線程副本中的值

initialValue() : 返回此線程局部變數的當前線程的”初始值”

set(T value) : 將此線程局部變數的當前線程副本中的值設置為value

示例代碼:

private static ThreadLocalInteger count= new ThreadLocalInteger(){

          @Override

          protected Integer initialValue(){ 

              return 1;

             }

     };            

 

public void add(int c){

                count.set(count.get() + c);

    }

7、使用阻塞隊列實現,例如LinkedBlockingQueue,具體使用可百度LinkedBlockingQueue的用法或查看java文檔。

JAVA中線程同步方法有哪些

JAVA中線程同步方法一般有以下三種:

1 wait方法:

該方法屬於Object的方法,wait方法的作用是使得當前調用wait方法所在部分(代碼塊)的線程停止執行,並釋放當前獲得的調用wait所在的代碼塊的鎖,並在其他線程調用notify或者notifyAll方法時恢復到競爭鎖狀態(一旦獲得鎖就恢復執行)。

調用wait方法需要注意幾點:

第一點:wait被調用的時候必須在擁有鎖(即synchronized修飾的)的代碼塊中。

第二點:恢復執行後,從wait的下一條語句開始執行,因而wait方法總是應當在while循環中調用,以免出現恢復執行後繼續執行的條件不滿足卻繼續執行的情況。

第三點:若wait方法參數中帶時間,則除了notify和notifyAll被調用能激活處於wait狀態(等待狀態)的線程進入鎖競爭外,在其他線程中interrupt它或者參數時間到了之後,該線程也將被激活到競爭狀態。

第四點:wait方法被調用的線程必須獲得之前執行到wait時釋放掉的鎖重新獲得才能夠恢復執行。

2 notify方法和notifyAll方法:

notify方法通知調用了wait方法,但是尚未激活的一個線程進入線程調度隊列(即進入鎖競爭),注意不是立即執行。並且具體是哪一個線程不能保證。另外一點就是被喚醒的這個線程一定是在等待wait所釋放的鎖。

notifyAll方法則喚醒所有調用了wait方法,尚未激活的進程進入競爭隊列。

3 synchronized關鍵字:

第一點:synchronized用來標識一個普通方法時,表示一個線程要執行該方法,必須取得該方法所在的對象的鎖。

第二點:synchronized用來標識一個靜態方法時,表示一個線程要執行該方法,必須獲得該方法所在的類的類鎖。

第三點:synchronized修飾一個代碼塊。類似這樣:synchronized(obj) { //code…. }。表示一個線程要執行該代碼塊,必須獲得obj的鎖。這樣做的目的是減小鎖的粒度,保證當不同塊所需的鎖不衝突時不用對整個對象加鎖。利用零長度的byte數組對象做obj非常經濟。

java 實現線程同步的方式有哪些

實現同步機制有兩個方法:

1、同步代碼塊:

synchronized(同一個數據){} 同一個數據:就是N條線程同時訪問一個數據。

2、同步方法:

public synchronized 數據返回類型 方法名(){}

就是使用 synchronized 來修飾某個方法,則該方法稱為同步方法。對於同步方法而言,無需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該對象的本身(這裡指的對象本身有點含糊,其實就是調用該同步方法的對象)通過使用同步方法,可非常方便的將某類變成線程安全的類,具有如下特徵:

1,該類的對象可以被多個線程安全的訪問。

2,每個線程調用該對象的任意方法之後,都將得到正確的結果。

3,每個線程調用該對象的任意方法之後,該對象狀態依然保持合理狀態。

註:synchronized關鍵字可以修飾方法,也可以修飾代碼塊,但不能修飾構造器,屬性等。

實現同步機制注意以下幾點: 安全性高,性能低,在多線程用。性能高,安全性低,在單線程用。

1,不要對線程安全類的所有方法都進行同步,只對那些會改變共享資源方法的進行同步。

2,如果可變類有兩種運行環境,當線程環境和多線程環境則應該為該可變類提供兩種版本:線程安全版本和線程不安全版本(沒有同步方法和同步塊)。在單線程中環境中,使用線程不安全版本以保證性能,在多線程中使用線程安全版本.

Java 線程同步幾種方式

(1)同步方法:

即有synchronized關鍵字修飾的方法。 由於java的每個對象都有一個內置鎖,當用此關鍵字修飾方法時,內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處於阻塞狀態。

(2)同步代碼塊

即有synchronized關鍵字修飾的語句塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,從而實現同步

(3)使用特殊域變數(Volatile)實現線程同步

a.volatile關鍵字為域變數的訪問提供了一種免鎖機制

b.使用volatile修飾域相當於告訴虛擬機該域可能會被其他線程更新

c.因此每次使用該域就要重新計算,而不是使用寄存器中的值

d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變數

(4)使用重入鎖實現線程同步

在JavaSE5.0中新增了一個java.util.concurrent包來支持同步。ReentrantLock類是可重入、互斥、實現了Lock介面的鎖, 它與使用synchronized方法和快具有相同的基本行為和語義,並且擴展了其能力。

(5)使用局部變數實現線程同步

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/284539.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 15:41
下一篇 2024-12-22 15:41

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29

發表回復

登錄後才能評論