1. 程式人生 > >面試高併發程式設計——synchronized(加鎖)

面試高併發程式設計——synchronized(加鎖)

併發——synchronized(加鎖)

一、宣告一個物件,專門用來管理鎖

/**
 * synchronized關鍵字
 * 對某個物件加鎖
 */

public class T {

    private int count = 10;
    private Object o = new Object();//宣告一個物件,專門用來管理鎖

    public void m() {
        synchronized(o) { //任何執行緒要執行下面的程式碼,必須先拿到o的鎖
            count--;
            System.out.println(Thread.currentThread().getName() + " count = "
+ count); } } }

二、對this加鎖

/**
 * synchronized關鍵字
 * 對某個物件加鎖
 */
public class T {

    private int count = 10;

    public void m() {
        synchronized(this) { //任何執行緒要執行下面的程式碼,必須先拿到this的鎖
            count--;
            System.out.println(Thread.currentThread().getName() + " count = "
+ count); } } }

三、執行方法時每次都加鎖,直接對方法名進行加鎖

/**
 * synchronized關鍵字
 * 對某個物件加鎖
 */

public class T {

    private int count = 10;

    public synchronized void m() { //等同於在方法的程式碼執行時要synchronized(this)
        count--;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }

}

四、當鎖定靜態方法時,由於靜態方法不需要通過物件可以直接進行呼叫,因此鎖定靜態方式時等同於synchronized(物件名.class)

/**
 * synchronized關鍵字
 * 對某個物件加鎖
 */

public class T {

    private static int count = 10;

    public synchronized static void m() { //這裡等同於synchronized(T.class)
        count--;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }

    public static void mm() {
        synchronized(T.class) { //考慮一下這裡寫synchronized(this)是否可以?
            count --;
        }
    }

}

面試注意:

  1. synchronized並不是對程式碼片段進行加鎖,而是對物件進行加鎖!
  2. 一個synchronized程式碼塊相當於一個原子操作,是不可分的,線上程在執行該程式碼塊的時候,是不可以被打斷的,只有當該執行緒執行完的時候,才能夠繼續執行同一段程式碼。

相關推薦

面試併發程式設計——synchronized()

併發——synchronized(加鎖) 一、宣告一個物件,專門用來管理鎖 /** * synchronized關鍵字 * 對某個物件加鎖 */ public class T {

併發】優化方式時竟然死了!!

寫在前面 今天,在優化程式的加鎖方式時,竟然出現了死鎖!!到底是為什麼呢?!經過仔細的分析之後,終於找到了原因。 為何需要優化加鎖方式? 在《【高併發】高併發環境下詭異的加鎖問題(你加的鎖未必安全)》一文中,我們在轉賬類TansferAccount中使用TansferAccount.class物件對程式加

併發程式設計 volatile 和 解決快取不一致

因為程式執行都在cpu中,但是如果沒有快取記憶體,cpu大部分的時間都用來了讀取記憶體的資料。 從而Cpu有 快取記憶體,在執行指令前,會把相關需要的資料提前拷貝到cpu,運算完成後在刷回記憶體裡。   快取記憶體主要提前快取資料到cpu,等cpu運算完成後把結果返回給主存

Java的併發程式設計系列(一)synchronized

private int count = 10; public void test(){ synchronized (this) { //任何執行緒要執行下面的程式碼,必須先拿到Demo02物件例項的鎖 count --;

Java併發程式設計synchronized關鍵字(二)

上一篇文章講了synchronized的部分關鍵要點,詳見:Java高併發程式設計之synchronized關鍵字(一) 本篇文章接著講synchronized的其他關鍵點。 在使用synchronized關鍵字的時候,不要以字串常量作為鎖定物件。看下面的例子: public class

Java併發程式設計synchronized關鍵字(一)

首先看一段簡單的程式碼: public class T001 { private int count = 0; private Object o = new Object(); public void m() { //任何執行緒要執行下面這段程式碼

併發程式設計系列:4種常用Java執行緒的特點,效能比較、使用場景

高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景 http://youzhixueyuan.com/4-kinds-of-java-thread-locks.html   在Java併發程式設計中,經常遇到多個執行緒訪問同一個 共享資源 ,這時候作為開發者

實戰Java併發程式設計(四、的優化及注意事項)

在多核時代,使用多執行緒可以明顯地提升系統的效能。但事實上,使用多執行緒會額外增加系統的開銷。對於單任務或單執行緒的應用來說,其主要資源消耗在任務本身。對於多執行緒來說,系統除了處理功能需求外,還需要維護多執行緒環境特有的資訊,如執行緒本身的元資料,執行緒的排程,執行緒上下文的切換等。 4.1有

併發程式設計併發場景:秒殺(無、排他、樂觀、redis快取的逐步演變)

環境: jdk1.8;spring boot2.0.2;Maven3.3 摘要說明: 在實際開發過程中往往會出現許多高併發場場景,秒殺,強紅包,搶優惠卷等; 其中: 秒殺場景的特點就是單位時間湧入使用者量極大,商品數少,且要保證不可超量銷售; 秒殺產品的本質就是減

面試系列-併發synchronized

  synchronized原理 在java中,每一個物件有且僅有一個同步鎖。這也意味著,同步鎖是依賴於物件而存在。當我們呼叫某物件的synchronized方法時,就獲取了該物件的同步鎖。例如,synchronized(obj)就獲取了“obj這個物件”的同步鎖。不同執行緒對同步

java併發程式設計總結三:JDK併發包之ReentrantLock重入

為了更好的支援併發程式,jdk內部提供了大量實用的API和框架,重入鎖就是一種對同步的擴充套件 ReentrantLock起源 在1.5的時候,synchronized關鍵的效能不是很好,這也是concurrent併發包出現的一種潛在原因,而新出

《Java併發程式設計》學習 --4.4 無

對於併發控制,鎖是一種悲觀的策略。它總是假設每一次的臨界區操作會產生衝突。如果有多個執行緒同時需要訪問臨界區資源,就寧可犧牲效能讓執行緒進行等待,所以說鎖會阻塞執行緒執行。而無鎖是一種樂觀的策略,它會假設對資源的訪問是沒有衝突的。無鎖的策略使用一種叫做比較交換的技術(CAS

《Java併發程式設計》學習 --5.4 高效能的生產者-消費者:無的實現

BlockingQueue實現生產者-消費者是一個不錯的選擇,它很自然地實現了作為生產者和消費者的記憶體緩衝區。但是,BlockingQueue並不是一個高效能的實現,它完全使用鎖和阻塞等待來實現執行緒間的同步。在高併發場合,它的效能並不是特別優越。 就像我們之前提過的C

02.第二階段、實戰Java併發程式設計模式-4.無

1.1. CAS CAS演算法的過程是這樣:它包含3個引數CAS(V,E,N)。V表示要更新的變數,E表示預期值,N表示新值。僅當V 值等於E值時,才會將V的值設為N,如果V值和E值不同,則說明已經有其他執行緒做了更新,則當前執行緒什麼 都不做。最後,CAS返回當前V的真實值。CAS操作是抱著樂觀的態度

實戰Java併發程式設計.epub

    【下載地址】 在過去單核CPU時代,單任務在一個時間點只能執行單一程式,隨著多核CPU的發展,並行程式開發就顯得尤為重要。 《實戰Java高併發程式設計》主要介紹基於Java的並行程式設計基礎、思路、方法和實戰。第一,立足於併發程式基礎,詳細介紹Ja

【轉】【MySQL】MySQL的併發控制與分析

https://www.cnblogs.com/yelbosh/p/5813865.html  本文主要是針對MySQL/InnoDB的併發控制和加鎖技術做一個比較深入的剖析,並且對其中涉及到的重要的概念,如多版本併發控制(MVCC),髒讀(dirty read),幻讀(phantom read

併發程式設計:同步類容器的問題

同步容器類存在的問題 同步類容器都是執行緒安全的,但在某些場景下可能需要加鎖來保護複合操作,在複合操作,如:迭代、跳轉已經條件運算中,這些操作可能會表現出意外的行為,最經典的便是ConcurrentModificationException,原因是當容器迭代的過程中,被併發的修改了內

併發程式設計併發Queue介面

佇列是一種先進先出或者後進後出的資料結構。在此我們模擬一下佇列這種資料結構: MyQueue.java定義如下: public class MyQueue { //佇列的容器 private LinkedList<Object> list = new L

併發程式設計:初識併發容器類

JDK5.0以後提供了多種併發類容器來替代同步容器類從而改善效能。同步類容器狀態都是序列化的。他們雖然實現了執行緒安全,但是嚴重降低了併發性,在多執行緒環境時,嚴重降低了應用程式的吞吐量。 ConcurrentMap介面 ConcurrentMap介面有兩個重要的實現類:Conc

併發程式設計:執行緒安全和ThreadLocal

執行緒安全的概念:當多個執行緒訪問某一個類(物件或方法)時,這個類始終都能表現出正確的行為,那麼這個類(物件或方法)就是執行緒安全的。 執行緒安全 說的可能比較抽象,下面就以一個簡單的例子來看看什麼是執行緒安全問題。 public class MyThread impleme