1. 程式人生 > >java的同步方法和同步程式碼塊,物件鎖,類鎖區別

java的同步方法和同步程式碼塊,物件鎖,類鎖區別

/**
 * @author admin
 * @date 2018/1/12 10:33
 * 作用在同一個例項物件上討論
 * Synchronized同步方法和同步程式碼塊
 * 1、synchronized和synchronized(this)二者沒區別,都作用在this物件鎖上面,所以會同步
 * 2、synchronized(obj),這個是作用在obj物件鎖上面,和this物件鎖不同,所以不會同步
 */
public class SynchronizedTest3 {
    public synchronized void methodA() {
        try {
            for (int i = 0; i < 5; i++) {
                System.out.println("methodA-" + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void methodB() {
        synchronized (this) {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodB-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void methodC() {
        Object obj = new Object();
        synchronized (obj) {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodC-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        SynchronizedTest3 test3 = new SynchronizedTest3();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                test3.methodA();
            }
        });
        thread1.start();

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                test3.methodB();
            }
        });
        thread2.start();

        Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                test3.methodC();
            }
        });
        thread3.start();

    }
}

執行結果:
methodA-0
methodC-0
methodA-1
methodC-1
methodA-2
methodC-2
methodA-3
methodC-3
methodA-4
methodC-4
methodB-0
methodB-1
methodB-2
methodB-3
methodB-4

相關推薦

java同步方法同步程式碼物件區別

/** * @author admin * @date 2018/1/12 10:33 * 作用在同一個例項物件上討論 * Synchronized同步方法和同步程式碼塊 * 1、synchronized和synchronized(this)二者沒區別,都作用在this物件鎖上面,所以會同步 *

深入理解使用synchronized同步方法同步程式碼區別

一.程式碼塊和方法之間的區別 首先需要知道程式碼塊和方法有什麼區別: 構造器和方法塊,構造器可以過載也就是說明在建立物件時可以按照不同的構造器來建立,那麼構造器是屬於物件,而程式碼塊呢他是給所有的物件初始化的。底下看一個列子: public class Constructor_Methodbloc

多執行緒併發問題以及單例設計模式與執行緒安全以及同步方法同步程式碼

執行緒安全和非執行緒安全 在作業系統中,執行緒是不擁有資源的,程序擁有資源。執行緒是由程序建立的,一個程序可以建立多個執行緒,這些執行緒共享程序中的資源。當多個執行緒同時操作一個變數時,這個時候就可能會造成資料的不一致性,此時就是執行緒不安全。 JVM有主記

同步方法同步程式碼的區別是什麼

在Java語言中,每一個物件有一把鎖。執行緒可以使用synchronized關鍵字來獲取物件上的鎖。synchronized關鍵字可應用在方法級別(粗粒度鎖)或者是程式碼塊級別(細粒度鎖)。 問題的由來: 看到這樣一個面試題: //下列兩個方法有什麼區別 public synchronized voi

執行緒中的同步程式碼synchronized、同步方法同步Lock

在學習執行緒的時候,因為執行緒的排程具有不確定性,所以銀行取錢問題、多個視窗售賣火車票問題都是反應多執行緒的優越性以及不確定性。當程式中有多個併發執行緒在進入一個程式碼塊中並且修改其中引數時,就很有可能引發執行緒安全問題從而造成異常。 同步程式碼塊 所以,j

同步方法同步程式碼區別

為何要使用同步?  java允許多執行緒併發控制,當多個執行緒同時操作一個可共享的資源變數時(如資料的增刪改查),      將會導致資料不準確,相互之間產生衝突,因此加入同步鎖以避免在該執行緒沒有完成操作之前,被其他執行緒的呼叫,      從而保證了該變數的唯一性和準確性。 1.同步方法 

同步方法同步程式碼的使用區別

同步方法的使用:在方法上加synchronized public synchronized void execute() { for(int i = 0; i < 20; i++) { try { Thread.sleep(

JAVA基礎(50)---靜態方法靜態程式碼

靜態方法                       用static修飾的方法。靜

JAVA---建構函式構造程式碼 finally

建構函式 使用格式: 修飾符 函式名(形參) { 函式體。。。} 作用: 給對應的物件進行初始化。。。 使用注意: ** 建構函式沒有返回值型別。 ** 建構函式的函式名必須與對應的類名一致。 ** 在建立物件時,jvm會根據形式引數的個數主動呼

多執行緒(2)-synchronized方法synchronized程式碼的用法

  前言        在介紹synchronized方法和synchronized程式碼塊前,先對監視器(Monitor)做一個說明,在java虛擬機器中,每個物件(object和class)通過某種邏輯關聯監視器,每個監視器和一個物件引用

synchronized的修飾方法修飾程式碼區別

文章思路 哪些概念難理解 類鎖和物件鎖區別 類鎖所有物件一把鎖 物件鎖一個物件一把鎖,多個物件多把鎖 同步是對同一把鎖而言的,同步這個概念是在多個執行緒爭奪同一把鎖的時候才能實現的,如果多個執行緒爭奪不同的鎖,那多個執行緒是不能同步的 兩個執行緒一

Java基礎知識之synchronized同步方法程式碼、靜態方法、靜態程式碼區別

      Java中的同步塊用synchronized標記,是同步在某個物件上,所有同步在一個物件上的同步塊在同一時刻只能被一個執行緒進入並執行操作,其他等待進入該同步塊的執行緒將被阻塞,直到執行該同步塊中的執行緒退出。 有四種不同的同步塊: 例項方法同步;

同步方法同步代碼的區別是什麽?

關鍵字 ont 當前 默認 style 而不是 span ron 加鎖 同步方法默認用this或者當前類class對象作為鎖。 同步代碼可以選擇以什麽來加鎖,比同步方法更細顆粒化,同步代碼可以同步有同步問題的部分代碼而不是整個方法。 同步方法用關鍵字synchronized

深入理解使用synchronized同步方法同步代碼區別

sys http ted 兩個 方法 ext tar extends idt 一.代碼塊和方法之間的區別 首先需要知道代碼塊和方法有什麽區別: 構造器和方法塊,構造器可以重載也就是說明在創建對象時可以按照不同的構造器來創建,那麽構造器是屬於對象,而代碼塊呢他是給所有的對象初

Java中synchronized同步方法

在多執行緒中,有一個經典問題:存票售票問題 如果只用兩個Thread子類則容易陷入死迴圈。 有一個很好的解決辦法就是synchronized。 方法一:在thread子類的run中直接通過synchronized來申請物件的鎖旗標,即用synchronized把存售票程式碼框起來。 方法二:在票類中直

java synchronized(靜態同步方法、非靜態同步方法同步

同步方法   同步方法所擁有的鎖就是該方法所屬的類的物件鎖,換句話說,也就是this物件,而且鎖的作用域也是整個方法,這可能導致其鎖的作用域可能太大,也有可能引起死鎖,同時因為可能包含了不需要進行同步的程式碼塊在內,也會降低程式的執行效率。 同步方法的鎖   同

同步方法同步程式碼區別

synchronized 方法控制類成員的訪問:每個類實力對應一把鎖,每個synchronized方法都必須獲得呼叫改方法的例項的所才能執行,否則所屬執行緒阻塞,方法一旦執行,就獨佔該鎖,直到從該方法返回時才將鎖釋放,此後被阻塞的執行緒方能獲得該鎖,重新進入可執行狀態。這種

java synchronized同步靜態方法同步非靜態方法區別與舉例

synchronized關鍵字是java併發程式設計中為了解決執行緒對共享資源的競爭造成錯誤,而提供的解決方案。synchronized關鍵字有兩種用法,一種是隻用於方法的定義中,另外一種是synchronized塊,我們不僅可以使用synchronized來同步一個物件

JAVA之類建構函式構造程式碼

類:         在我們的日常生活中,對於事物的描述無非就是描述事物的屬性和行為。如:人的身高,體重,年齡等稱為屬性,人會說話,會跑步,會做飯等等稱為行為。         而對於Java中的類,無非也是如此,包含了屬性和行為。 類的定義: 屬性:對應類中的成員變數行

執行緒-synchronized方法同步的作用範圍;synchronized(this)synchronized(obj)的區別

原文:http://m.blog.csdn.net/blog/u010802573/38661719 參考資源: http://www.cnblogs.com/oracleDBA/archive/2010/05/22/1741642.html http://www