成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Synchronized 和 Lock 到底有什么區別

開發 前端
Synchronized是Java語言內置的關鍵字,它的實現是基于JVM的,源碼在JVM中,用C++語言實現。其鎖機制是基于對象頭的Mark Word來實現的,包括偏向鎖、輕量級鎖和重量級鎖。當線程嘗試進入synchronized代碼塊或方法時,JVM會根據當前對象的鎖狀態以及線程的鎖請求來進行相應的處理。

我們昨天說過了關于這個 Java 的 volatile 關鍵字了,但是我們還需要知道一個關鍵字,那么就是 synchronized 這個關鍵字,為什么呢?因為在開發的過程中我們會經常的使用到這個關鍵字,但是呢,又會有很多的人對這個理解的不明白,并且,和 lock 一起給混淆掉,今天了不起就來說說這個 synchronized 和 lock 的區別。

synchronized

synchronized 是Java中的一個關鍵字,用于控制對共享資源的并發訪問,從而防止多個線程同時訪問某個特定資源,這被稱為同步。這個關鍵字可以用來修飾方法或代碼塊。

修飾方法

當synchronized修飾一個方法時,它表示整個方法體都是同步的,即同時只能有一個線程可以執行這個方法。

代碼示例:

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

修飾代碼塊

synchronized也可以用來修飾一個代碼塊,這時需要指定一個鎖對象。當一個線程進入synchronized代碼塊時,它需要獲得這個鎖對象的監視器鎖,如果鎖已經被其他線程持有,則該線程將被阻塞,直到鎖被釋放。

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

在這個例子中,this是鎖對象。你也可以使用其他對象作為鎖。

我們需要注意的幾點內容:

  • synchronized鎖是可重入的,也就是說,一個線程可以多次獲得同一個鎖而不會發生死鎖。
  • 使用synchronized需要謹慎,因為不當的使用可能導致死鎖或性能問題。
  • synchronized是一種內置鎖,也被稱為互斥鎖或監視器鎖。Java中的每個對象都有一個與之關聯的監視器鎖。
  • synchronized關鍵字的實現是基于JVM的,因此它的行為可能因JVM的實現而異。

我們總結一下:

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

那么 Lock 呢?

LOCK

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

Lock 接口的主要方法

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

而這個 Lock 的主要實現類就是ReentrantLock。

也就是可重入鎖,意味著一個線程可以多次獲取同一個鎖而不會發生死鎖。它提供了與 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;  
    }  
}

在這個例子中,Counter 類使用了一個 ReentrantLock 來確保 increment 方法的原子性。每次調用 increment 方法時,都會先獲取鎖,然后增加計數器,最后釋放鎖。

LOCK 和 synchronized 的比較

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

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

鎖分離: Lock 允許將等待/通知機制與鎖分離,通過 Condition 對象來實現,而 synchronized 的等待/通知是與對象鎖關聯的。

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

語法簡潔性: synchronized 的語法更簡潔,適合簡單的同步需求。

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

但是他們的底層區別在哪呢?

lock 和 synchronized 底層原理區別

Synchronized是Java語言內置的關鍵字,它的實現是基于JVM的,源碼在JVM中,用C++語言實現。其鎖機制是基于對象頭的Mark Word來實現的,包括偏向鎖、輕量級鎖和重量級鎖。當線程嘗試進入synchronized代碼塊或方法時,JVM會根據當前對象的鎖狀態以及線程的鎖請求來進行相應的處理。

Lock是一個接口,它的實現類如ReentrantLock是由JDK提供的,用Java語言實現。Lock的實現是基于Java代碼的,它通過內部的AbstractQueuedSynchronizer(AQS)框架來實現鎖的獲取、釋放以及線程等待和喚醒等功能。AQS框架是JDK中提供的一個用于構建鎖和同步器的框架,它維護了一個FIFO的隊列來管理等待獲取鎖的線程。

對于他們的區別,你理解了多少呢?

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-09-06 10:45:18

XDRMDR

2022-09-14 09:45:15

指標標簽

2012-07-25 15:45:28

ERPSCM

2022-10-27 19:32:20

切片golang數組

2019-04-23 08:23:51

統計學機器學習人工智能

2023-07-19 21:54:02

小區扇區信號

2020-10-29 09:49:32

HarmonyOS鴻蒙安卓應用

2023-03-08 09:48:08

SpringWAR文件JAR文件

2020-08-19 08:10:11

數據分析技術IT

2022-04-24 07:59:53

synchronizJVMAPI

2021-04-26 05:36:59

物聯網

2016-05-23 15:50:41

Linuxnice(NI)priority(PR

2022-08-26 01:41:42

GPUCPU架構

2023-02-01 07:15:16

2024-04-12 00:00:00

localhost計算機機制

2022-08-16 07:32:03

RestfulSOAPRPC

2022-11-09 23:27:31

無線Wi-Fi網絡

2025-06-13 08:05:00

DevOps運維SRE

2022-04-26 08:02:00

locktryLocklockInterr

2022-06-13 07:36:06

MySQLInnoDB索引
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲天堂精品一区 | 91网站在线看 | 成人精品一区二区三区四区 | 夜夜草天天草 | 色综合99 | 日韩免费网站 | 91精品国产乱码久久久久久久久 | 久久精品久久久久久 | 狠狠婷婷综合久久久久久妖精 | 国产一区二区在线免费观看 | 欧美久久久网站 | 日韩免费中文字幕 | 国产一区日韩在线 | 1级黄色大片 | 国产视频中文字幕 | 男女羞羞视频在线 | www..com18午夜观看 | 真人女人一级毛片免费播放 | 欧美一级片在线看 | 成人欧美一区二区 | 丁香一区二区 | 成人在线免费观看 | 国产精品久久久久久久久久软件 | 一级特黄在线 | a级性视频 | 中文字幕 亚洲一区 | 欧美日韩中文字幕在线 | 久久精品视频9 | 亚洲精品日韩一区二区电影 | 华人黄网站大全 | 成人视屏在线观看 | 精品免费国产视频 | 高清亚洲| 欧美激情啪啪 | 久久精品国产亚洲一区二区 | 日韩高清不卡 | 亚洲日韩欧美一区二区在线 | 中文字幕91 | 国产精品九九 | 国产成人精品久久二区二区91 | 黄色电影在线免费观看 |