偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Synchronized 和 Lock 到底有什么區(qū)別

開(kāi)發(fā) 前端
Synchronized是Java語(yǔ)言內(nèi)置的關(guān)鍵字,它的實(shí)現(xiàn)是基于JVM的,源碼在JVM中,用C++語(yǔ)言實(shí)現(xiàn)。其鎖機(jī)制是基于對(duì)象頭的Mark Word來(lái)實(shí)現(xiàn)的,包括偏向鎖、輕量級(jí)鎖和重量級(jí)鎖。當(dāng)線程嘗試進(jìn)入synchronized代碼塊或方法時(shí),JVM會(huì)根據(jù)當(dāng)前對(duì)象的鎖狀態(tài)以及線程的鎖請(qǐng)求來(lái)進(jìn)行相應(yīng)的處理。

我們昨天說(shuō)過(guò)了關(guān)于這個(gè) Java 的 volatile 關(guān)鍵字了,但是我們還需要知道一個(gè)關(guān)鍵字,那么就是 synchronized 這個(gè)關(guān)鍵字,為什么呢?因?yàn)樵陂_(kāi)發(fā)的過(guò)程中我們會(huì)經(jīng)常的使用到這個(gè)關(guān)鍵字,但是呢,又會(huì)有很多的人對(duì)這個(gè)理解的不明白,并且,和 lock 一起給混淆掉,今天了不起就來(lái)說(shuō)說(shuō)這個(gè) synchronized 和 lock 的區(qū)別。

synchronized

synchronized 是Java中的一個(gè)關(guān)鍵字,用于控制對(duì)共享資源的并發(fā)訪問(wèn),從而防止多個(gè)線程同時(shí)訪問(wèn)某個(gè)特定資源,這被稱為同步。這個(gè)關(guān)鍵字可以用來(lái)修飾方法或代碼塊。

修飾方法

當(dāng)synchronized修飾一個(gè)方法時(shí),它表示整個(gè)方法體都是同步的,即同時(shí)只能有一個(gè)線程可以執(zhí)行這個(gè)方法。

代碼示例:

public synchronized void synchronizedMethod() {  
    // 方法體  
}

修飾代碼塊

synchronized也可以用來(lái)修飾一個(gè)代碼塊,這時(shí)需要指定一個(gè)鎖對(duì)象。當(dāng)一個(gè)線程進(jìn)入synchronized代碼塊時(shí),它需要獲得這個(gè)鎖對(duì)象的監(jiān)視器鎖,如果鎖已經(jīng)被其他線程持有,則該線程將被阻塞,直到鎖被釋放。

public void method() {  
    synchronized (this) {  
        // 代碼塊  
    }  
}

在這個(gè)例子中,this是鎖對(duì)象。你也可以使用其他對(duì)象作為鎖。

我們需要注意的幾點(diǎn)內(nèi)容:

  • synchronized鎖是可重入的,也就是說(shuō),一個(gè)線程可以多次獲得同一個(gè)鎖而不會(huì)發(fā)生死鎖。
  • 使用synchronized需要謹(jǐn)慎,因?yàn)椴划?dāng)?shù)氖褂每赡軐?dǎo)致死鎖或性能問(wèn)題。
  • synchronized是一種內(nèi)置鎖,也被稱為互斥鎖或監(jiān)視器鎖。Java中的每個(gè)對(duì)象都有一個(gè)與之關(guān)聯(lián)的監(jiān)視器鎖。
  • synchronized關(guān)鍵字的實(shí)現(xiàn)是基于JVM的,因此它的行為可能因JVM的實(shí)現(xiàn)而異。

我們總結(jié)一下:

synchronized 可以給類,方法,代碼塊加鎖。

那么 Lock 呢?

LOCK

Java 的 Lock 接口及其實(shí)現(xiàn)類提供了一種比 synchronized 關(guān)鍵字更加靈活和可控制的鎖機(jī)制。Lock 接口在 java.util.concurrent.locks 包中定義,它允許更細(xì)粒度的控制,包括嘗試獲取鎖、定時(shí)獲取鎖以及可中斷地獲取鎖等能力。

Lock 接口的主要方法

  1. lock(): 獲取鎖。如果鎖被其他線程持有,則當(dāng)前線程將被禁用,直到獲取到鎖。
  2. tryLock(): 嘗試獲取鎖,如果成功則立即返回 true,如果鎖被其他線程持有則返回 false。
  3. tryLock(long time, TimeUnit unit): 在指定的時(shí)間內(nèi)嘗試獲取鎖,如果成功則返回 true,如果在指定時(shí)間內(nèi)沒(méi)有獲取到鎖則返回 false。
  4. unlock(): 釋放鎖。
  5. newCondition(): 返回一個(gè)綁定到此 Lock 實(shí)例的 Condition 對(duì)象,用于等待/通知機(jī)制。

而這個(gè) Lock 的主要實(shí)現(xiàn)類就是ReentrantLock。

也就是可重入鎖,意味著一個(gè)線程可以多次獲取同一個(gè)鎖而不會(huì)發(fā)生死鎖。它提供了與 synchronized 類似的功能,但提供了更多的靈活性。

我們看一段代碼示例:

import java.util.concurrent.locks.Lock;  
import java.util.concurrent.locks.ReentrantLock;  
  
public class Counter {  
    private final Lock lock = new ReentrantLock();  
    private int count = 0;  
  
    public void increment() {  
        lock.lock();  // 獲取鎖  
        try {  
            count++;  
        } finally {  
            lock.unlock();  // 釋放鎖  
        }  
    }  
  
    public int getCount() {  
        return count;  
    }  
}

在這個(gè)例子中,Counter 類使用了一個(gè) ReentrantLock 來(lái)確保 increment 方法的原子性。每次調(diào)用 increment 方法時(shí),都會(huì)先獲取鎖,然后增加計(jì)數(shù)器,最后釋放鎖。

LOCK 和 synchronized 的比較

靈活性: Lock 提供了更靈活的鎖獲取方式,包括嘗試獲取和定時(shí)獲取,而 synchronized 不支持這些功能。

等待可中斷: Lock 的獲取操作可以被中斷,而 synchronized 的等待不能被中斷。

鎖分離: Lock 允許將等待/通知機(jī)制與鎖分離,通過(guò) Condition 對(duì)象來(lái)實(shí)現(xiàn),而 synchronized 的等待/通知是與對(duì)象鎖關(guān)聯(lián)的。

性能: 在某些情況下,ReentrantLock 可能比 synchronized 提供更好的性能,特別是在高競(jìng)爭(zhēng)的場(chǎng)景下,但這也取決于具體的使用情況。

語(yǔ)法簡(jiǎn)潔性: synchronized 的語(yǔ)法更簡(jiǎn)潔,適合簡(jiǎn)單的同步需求。

所以大家在選擇使用 Lock 還是 synchronized 取決于具體的應(yīng)用場(chǎng)景和需求。在需要更高級(jí)功能或更高性能的場(chǎng)景下,Lock 可能是更好的選擇。在簡(jiǎn)單的同步需求下,synchronized 通常更易于使用和理解。

但是他們的底層區(qū)別在哪呢?

lock 和 synchronized 底層原理區(qū)別

Synchronized是Java語(yǔ)言內(nèi)置的關(guān)鍵字,它的實(shí)現(xiàn)是基于JVM的,源碼在JVM中,用C++語(yǔ)言實(shí)現(xiàn)。其鎖機(jī)制是基于對(duì)象頭的Mark Word來(lái)實(shí)現(xiàn)的,包括偏向鎖、輕量級(jí)鎖和重量級(jí)鎖。當(dāng)線程嘗試進(jìn)入synchronized代碼塊或方法時(shí),JVM會(huì)根據(jù)當(dāng)前對(duì)象的鎖狀態(tài)以及線程的鎖請(qǐng)求來(lái)進(jìn)行相應(yīng)的處理。

Lock是一個(gè)接口,它的實(shí)現(xiàn)類如ReentrantLock是由JDK提供的,用Java語(yǔ)言實(shí)現(xiàn)。Lock的實(shí)現(xiàn)是基于Java代碼的,它通過(guò)內(nèi)部的AbstractQueuedSynchronizer(AQS)框架來(lái)實(shí)現(xiàn)鎖的獲取、釋放以及線程等待和喚醒等功能。AQS框架是JDK中提供的一個(gè)用于構(gòu)建鎖和同步器的框架,它維護(hù)了一個(gè)FIFO的隊(duì)列來(lái)管理等待獲取鎖的線程。

對(duì)于他們的區(qū)別,你理解了多少呢?

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2021-09-06 10:45:18

XDRMDR

2022-10-27 19:32:20

切片golang數(shù)組

2022-09-14 09:45:15

指標(biāo)標(biāo)簽

2012-07-25 15:45:28

ERPSCM

2019-04-23 08:23:51

統(tǒng)計(jì)學(xué)機(jī)器學(xué)習(xí)人工智能

2023-07-19 21:54:02

小區(qū)扇區(qū)信號(hào)

2020-10-29 09:49:32

HarmonyOS鴻蒙安卓應(yīng)用

2023-03-08 09:48:08

SpringWAR文件JAR文件

2020-08-19 08:10:11

數(shù)據(jù)分析技術(shù)IT

2022-04-24 07:59:53

synchronizJVMAPI

2021-04-26 05:36:59

物聯(lián)網(wǎng)

2016-05-23 15:50:41

Linuxnice(NI)priority(PR

2023-02-01 07:15:16

2022-08-26 01:41:42

GPUCPU架構(gòu)

2024-04-12 00:00:00

localhost計(jì)算機(jī)機(jī)制

2022-08-16 07:32:03

RestfulSOAPRPC

2025-06-13 08:05:00

DevOps運(yùn)維SRE

2022-11-09 23:27:31

無(wú)線Wi-Fi網(wǎng)絡(luò)

2022-04-26 08:02:00

locktryLocklockInterr

2022-06-13 07:36:06

MySQLInnoDB索引
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)