1. 程式人生 > >證實同步函式使用的是this鎖

證實同步函式使用的是this鎖

**提前先注意這個提醒::
1.同步函式分為靜態和非靜態的,下邊演示的是非靜態的方式,準確來說應該是非靜態同步函式採用的是this**鎖,靜態函式採用的是當前類的位元組碼檔案,也就是(類.class),這裡就不做演示。
2.共享全域性變數是靜態的或者是非靜態的跟同步函式(靜態同步函式)沒有任何關係,不影響。
直接看程式碼:先看正確的,沒有髒資料。

package thread;

class Thread02 implements Runnable{

    private int countTicket = 100;
    private static Object obj = new
Object(); public static boolean flag = true; @Override public void run() { if(flag){//使用同步鎖--this while(countTicket>0){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } sale1(); } }else
{//使用同步函式 while(countTicket>0){ try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } sale(); } } } public void sale1(){ synchronized
(this){ if(countTicket>0){ //------當把這個if判斷去掉 最後還是會有兩個執行緒來爭奪最後一張票 會挨個執行,資料不會出錯,但是邏輯會出錯。 System.out.println("當前執行緒名字:"+Thread.currentThread().getName()+";出售第"+(100 - countTicket + 1)+"張票。"); countTicket--; } } } public synchronized void sale(){ if(countTicket>0){ //賣票 System.out.println("當前執行緒名字:"+Thread.currentThread().getName()+";出售第"+(100 - countTicket + 1)+"張票。"); countTicket--; } } } public class ThreadDemo1 { public static void main(String[] args) throws InterruptedException { Thread02 t = new Thread02(); Thread t1 = new Thread(t,"視窗1"); Thread t2 = new Thread(t,"視窗2"); t1.start(); Thread.sleep(50); Thread02.flag=false; t2.start(); } }

然後把sale1()中synchronized(this)的this換成obj再次執行,檢視結果,就會出現錯誤資料,說明兩個執行緒的鎖型別不一樣,從而證明同步函式採用的是this鎖。

相關推薦

證實同步函式使用的是this

**提前先注意這個提醒:: 1.同步函式分為靜態和非靜態的,下邊演示的是非靜態的方式,準確來說應該是非靜態同步函式採用的是this**鎖,靜態函式採用的是當前類的位元組碼檔案,也就是(類.class)

java多執行緒詳解四 驗證同步函式this

驗證同步函式的鎖是this /** * Created by Perk on 2016/7/17. */ class Ticket implements Runnable { private int num = 200; Object object =

畢向東講解(摘)—7.多執行緒安全問題(同步函式this驗證)

package day6; /**  * 同步程式碼塊和同步函式  * 對同步函式的鎖是否為this的驗證  *  * @author mzy  *  *  因為本身同步程式碼塊我們傳入的鎖物件是當前物件this  *  只要同步函式的鎖物件是this的話,那麼我們的賣票

java-同步函式this

/* 同步函式用的是哪一個鎖呢? * 函式需要被物件呼叫,那麼函式都有一個所屬物件引用,就是this * 所以同步函式使用的鎖都是this,通過該程式進行驗證 * 使用兩個執行緒來賣票:一個執行緒在同步程式碼塊中,一個執行緒在同步函式中.都在執行賣票成 * */ p

面向物件-多執行緒(同步函式this與靜態同步函式是class)

同步函式使用的是哪一個鎖呢?函式需要被物件呼叫,那麼函式都有一個所屬物件引用,就是this。。所以同步函式使用的鎖是this。程式碼:class Demo implements Runnable { private int t=200; Object obj = new

33-多執行緒--賣票示例+執行緒安全(產生原因+解決方式:同步)+同步同步程式碼塊+同步的好處與弊端+同步的前提+同步函式+賣票示例的同步函式寫法+驗證同步函式+驗證靜態同步函式

一、賣票示例 需求:四個視窗,同時售賣100張票,票號為1-100 1、沒有多執行緒時的賣票程式碼 class Ticket { //100張票 private int num = 100; public void sale() { /

java-靜態同步函式是Class物件

/* 如果同步函式被靜態修飾後,使用的鎖是什麼呢? * 通過驗證,發現不在是this。因為靜態方法中也不可以定義this * 靜態進記憶體是,記憶體中沒有本類物件,但是一定有該類對應的位元組碼檔案物件。 * 類名.class 該物件的型別是Class * 靜態的同步

Java多執行緒6 中同步函式同步程式碼塊的的區別

同步程式碼塊的出現是解決了多執行緒的安全問題,但是它增加了程式碼的縮排層級,同時降低了效率(每次無論是不是對的鎖,每個路徑都要去判斷) 針對同步出現的這兩個問題,首先討論第一個。因此引出一個新的知識點———————— 同步函式 關於同步函式的使用(一買車票的程式碼為例子

多執行緒——靜態同步函式的相關問題

package com.qianfeng.demo01; /** * 關於靜態同步函式使用的鎖 * * 靜態同步函式的鎖是什麼呢? * 靜態隨著類的載入而載入,而這時記憶體中儲存的物件至少有

(多執行緒-靜態同步函式是Class物件)

/* 如果同步函式被靜態修飾後,使用的鎖是什麼呢? 通過驗證,發現不在是this。因為靜態方法中也不可以定義this。 靜態進記憶體是,記憶體中沒有本類物件,但是一定有該類對應的位元組碼檔案物件。 類名.class 該物件的型別是Class 靜態的同

java多執行緒-同步函式

/* 通過分析打印出錯誤票 多執行緒的執行出現了安全問題。 問題的原因: 當多條語句在操作同一個執行緒共享資料時,一個執行緒對多條語句執行了一部分,還沒有執行完 另一個執行緒參與進來執行。導

JAVA 同步函式this

//僅作為學習筆記 /* 同步函式用的是this鎖 函式需要被物件呼叫。那麼函式都有一個所屬物件呼叫,就是this 所以同步函式使用的鎖是this 通過該程式進行驗證 使用兩個執行緒來賣票 一個執行緒在同步程式碼塊中 一個執行緒在同步函式中

Java synchronized併發同步詳細使用操作技巧-類、物件this、非this

synchronized基礎特點:   synchronized鎖是可重入的,且在父子類繼承中同樣適用; synchronized鎖在遇到異常時自動釋放鎖; synchronized鎖的同步化不可以繼承;   1、非執行緒安全的高發區  

關於GCD中同步函式+主佇列產生死的一點理解

首先看個產生死鎖的程式碼 -(void)syncMain{ //獲得主佇列 dispatch_queue_t queue = dispatch_get_main_queue(

同步同步函式的使用方法

class Ticket implements Runnable {private int num=300;//Object obj = new Object();     boolean flag=true;public void run(){if(flag)while(

同步函式中使用

如果同步函式被靜態修飾後,使用的鎖是什麼呢? 通過驗證,發現不是this,因為靜態方法中也不可以定義this。 靜態進記憶體時,記憶體中沒有本類物件,但是一定有該類對應的位元組碼檔案物件。 類名.class,該物件的型別是Class. 靜態的同步方法,使用的鎖是剛方法所

Java之線程,常用方法,線程同步,死

時間 imp log 沖突 根據 oms adl 無法 誰的 1, 線程的概念 進程與線程 進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。(進程是資源分配的最小單位) 線程:同一類線程共享代碼和數據空間,每個線

MySQL數據庫同步之悲觀和樂觀

我們 測試 http 鎖定 以及 再次 否則 即使 name 測試需要:本地開兩個測試窗口 悲觀鎖 悲觀鎖它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,在整個數據處理過程中,將數據處於鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的

Java多線程 同步 對象

java多線 tar https sdn wait obj article java多線程 csdn 多線程、同步: https://www.cnblogs.com/GarfieldEr007/p/5746362.html Java對象鎖和類鎖全面解析(多線程synch

Python之進程同步控制(信號量事件 )、進程間通信——隊列和管道

load 很快 容器 數據安全 全部 傳遞 幫我 之前 引入 進程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) 鎖 —— multiprocess.Lock 通過剛剛的學習,我們千方百計實現了