證實同步函式使用的是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 通過剛剛的學習,我們千方百計實現了