一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java中synchronized Lock(本地同步)鎖的8種情況

java中synchronized Lock(本地同步)鎖的8種情況

2022-01-13 01:08A.Dun Java教程

本文主要介紹了java中synchronized Lock(本地同步)鎖的8種情況,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Lock(本地同步)鎖的8種情況總結與說明:

* 題目:
* 1.標準訪問,請問是先打印郵件還是短信 Email
* 2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信 Email
* 3.新增普通的hello方法,請問先打印郵件還是hello hello
* 4.兩部手機,請問先打印郵件還是短信 SMS
* 5.兩個靜態同步方法,1部手機,請問先打印郵件還是短信 Email
* 6.兩個靜態同步方法,2部手機,請問先打印郵件還是短信 Email
* 7.一個普通同步方法,一個靜態同步方法,1部手機,請問先打印郵件還是短信 SMS
* 8.一個普通同步方法,一個靜態同步方法,2部手機,請問先打印郵件還是短信 SMS
*
* lock1、2
* 一個對象里面如果有多個synchronized方法,某一時刻內,只要一個線程去調用其中的一個synchronized方法,
* 其他的線程都只能等待,換句話說,某一時刻內,只能有唯一一個線程去訪問這些synchronized方法,
* 鎖的是當前對象的this,被鎖定后,其它的線程都不能進入到當前對象的其它的synchronized方法
*
* lock3、4
* 加個普通的方法后和同步鎖無關
* 換成兩個對象后,不是同一把鎖了,情況立刻變化
*
* lock5、6
* 都換成靜態同步方法后,情況又變化(靜態鎖的是Class類對象)
* 若是普通同步方法,new this,具體的一部一部手機,所有的普通同步方法用的都是同一把鎖----示例對象本身
* 若是靜態同步方法,static class,唯一的一個模板
* synchronized是實現同步的基礎:Java中的每一個對象都可以作為鎖
* 具體表現為一下3種形式。
* 對于普通同步方法,鎖是當前實例對象。它等同于 對于同步方法塊,鎖是synchronized括號里的配置的對象。
* 對于靜態同步方法,鎖是當前類的Class類元信息
*
* lock7、8
* 當一個線程試圖訪問同步代碼塊時它首先必須得到鎖,退出或拋出異常時必須釋放鎖
*
* 所有的同步方法用的都是同一把鎖----實例對象本身,就是new出來的具體實例對象本身
* 也就是說如果一個實例對象的普通同步方法獲取鎖后,該實例對象的其他普通同步方法必須等待獲取鎖的方法釋放鎖后才能獲得鎖
* 可是別的實例對象的普通同步方法因為跟該實例對象的普通同步方法用到是不同鎖,所以不用等待該實例對象已獲取鎖的普通
* 同步方法釋放鎖就可以獲取它們自己的鎖
*
* 所有的靜態同步方法用的也是同一把鎖----類對象本身,就是我們說過的唯一模板Class
* 具體實例對象this和唯一模板Class,這兩把鎖是兩個不同的對象,所有靜態同步方法與普通同步方法之間是不會有競態條件的,
* 但是一旦一個靜態同方法獲取鎖后,其他的靜態同步方法都必須等待該方法釋放鎖后才能獲取鎖。

lock1、2、3一個實例對象

lock4、5、6、7、8兩個實例對象

 

lock1

1.標準訪問,請問是先打印郵件還是短信?答案:Email

sendEmail()與sendSms()都是普通同步方法,都使用synchronized鎖

這里按方法調用順序,依次執行,當前synchronized鎖住的是同一個實例對象

package day02_lam;
 
import java.util.concurrent.TimeUnit;
 
class Phone{
    public synchronized void sendEmail() throws InterruptedException{
         System.out.println("------------sendEmail");
    }

    public  synchronized void sendSms(){
     System.out.println("------------sendSMS");
    }

}
 
/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信     Email
*/
public class Lock8{
	public static void main(String[] args) throws InterruptedException{
        Phone phone=new Phone();
        //線程A發送Email
        new Thread(()->{
                try{
                    phone.sendEmail();
                }catch(InterruptedExceptione){
                    e.printStackTrace();
                }
            },"A").start();

        Thread.sleep(300);
        
        //線程B發送短信
        newThread(()->{
            phone.sendSms();
        },"B").start();
    }
}

java中synchronized Lock(本地同步)鎖的8種情況

 

lock2

2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信? 答案:Email

lock2是lock1的變形,其原理與lock1一致,synchronized鎖住的是同一個對象,必須等到第一個方法把鎖釋放后,第二個方法才能夠獲得鎖

package day02_lam;

import java.util.concurrent.TimeUnit;

class Phone{
	public synchronized void sendEmail()throwsInterruptedException{
        //睡眠4秒種
		TimeUnit.SECONDS.sleep(4);
		System.out.println("------------sendEmail");
	}
	
	public synchronized void sendSms(){
		System.out.println("------------sendSMS");
	}

}

/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信Email
*2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信Email
*/
public class Lock8{
    public static void main(String[] args)throws InterruptedException{
        //資源類
        Phone phone=new Phone();
		
        //線程A sendEmail
        newThread(()->{
            try{
                phone.sendEmail();
            }catch(InterruptedExceptione){
                e.printStackTrace();
            }
        },"A").start();

		//這里保證線程A能夠執行完
   	 	Thread.sleep(300);

        //線程B sendSms
        newThread(()->{
            phone.sendSms();
        },"B").start();

    }
}

結果:等待4秒中后出現sendEmail與sendSMS同時輸出

java中synchronized Lock(本地同步)鎖的8種情況

 

lock3

3.新增普通的hello方法,請問先打印郵件還是hello? 答案:hello

只有添加synchronized關鍵字的方法才會被synchronized鎖控制

package day02_lam;

import java.util.concurrent.TimeUnit;

class Phone{
	public synchronized void sendEmail()throws InterruptedException{
		TimeUnit.SECONDS.sleep(4);
		System.out.println("------------sendEmail");
	}

	public synchronized void sendSms(){
		System.out.println("------------sendSMS");
	}

	public void hello(){//未加synchronized
		System.out.println("hello");
	}
}

/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信Email
*2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信Email
*3.新增普通的hello方法,請問先打印郵件還是hello    hello
*/
public  class Lock8{
    public static void main(String[] args)throws InterruptedException{
        Phone phone=new Phone();
		
        //線程A調用sendEmail
        new Thread(()->{
            try{
                phone.sendEmail();
            }catch(InterruptedExceptione){
                e.printStackTrace();
            }
        },"A").start();

   		Thread.sleep(300);

       	//線程B調用普通方法hello
        new Thread(()->{
            //phone.sendSms();
            phone.hello();
        },"B").start();

    }
}

結果:hello先輸出,4s后sendEmail再輸出

java中synchronized Lock(本地同步)鎖的8種情況

 

lock4

4.兩部手機,請問先打印郵件還是短信 ? 答案:SMS

不同實例對象,synchronized鎖住的是對應的調用對象

package day02_lam;

import java.util.concurrent.TimeUnit;

class Phone{
	public synchronized void sendEmail()throws InterruptedException{
        //睡眠4秒種
		TimeUnit.SECONDS.sleep(4);
		System.out.println("------------sendEmail");
	}
	
	public synchronized void sendSms(){
		System.out.println("------------sendSMS");
	}
	
	public void hello(){
		System.out.println("hello");
	}
}

/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信Email
*2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信Email
*3.新增普通的hello方法,請問先打印郵件還是hellohello
*4.兩部手機,請問先打印郵件還是短信 SMS
*/
public class Lock8{
public static void main(String[] args)throws InterruptedException{
		Phone phone=new Phone();
		Phone phone2=new Phone();
	
		//sychronized鎖定是當前對象對應的this,phone與phone2分別鎖的是自己的this
		
    	//線程A使用實例phone調用sendEmail
		newThread(()->{
			try{
                //sendEmail方法中包含睡眠4秒種
				phone.sendEmail();
			}catch(InterruptedExceptione){
				e.printStackTrace();
			}
		},"A").start();
	
		Thread.sleep(300);
	
    	//線程B使用實例phone2調用sendSms
		newThread(()->{
			phone2.sendSms();
			//phone.hello();
		},"B").start();
	
	}
}

結果:sendSMS先輸出,4s后sendEmail再輸出

java中synchronized Lock(本地同步)鎖的8種情況

 

lock5

5.兩個靜態同步方法,1部手機,請問先打印郵件還是短信? 答案:Email

synchronized鎖靜態方法,實際是鎖住的類元信息,因為靜態方法是隨類元信息的加載而保存到jvm的靜態區,是所有實例創建的模板

package day02_lam;

import java.util.concurrent.TimeUnit;

class Phone{
	public static synchronized void sendEmail()throws InterruptedException{
		TimeUnit.SECONDS.sleep(4);
		System.out.println("------------sendEmail");
	}
	
	public static synchronized void sendSms(){
	
		System.out.println("------------sendSMS");
	}
	
	public void hello(){
		System.out.println("hello");
	}
}

/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信Email
*2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信Email
*3.新增普通的hello方法,請問先打印郵件還是hellohello
*4.兩部手機,請問先打印郵件還是短信SMS
*5.兩個靜態同步方法,1部手機,請問先打印郵件還是短信 Email
*/
public class Lock8{
public  static void main(String[] args)throws InterruptedException{
	Phone phone=new Phone();
	
	new Thread(()->{
		try{
			phone.sendEmail();
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	},"A").start();
	
	Thread.sleep(300);
	
	newThread(()->{
		phone.sendSms();
	},"B").start();
	
	}
}

結果:4秒種后,sendEmail率先輸出,sendSMS緊隨其后

java中synchronized Lock(本地同步)鎖的8種情況

 

lock6

6.兩個靜態同步方法,2部手機,請問先打印郵件還是短信? 答案:Email

與lock5的運行結果一致,當前synchronized鎖住的是類元信息

package day02_lam;

import java.util.concurrent.TimeUnit;

class Phone{
    public static synchronized void sendEmail() throws InterruptedException{
        TimeUnit.SECONDS.sleep(4);
        System.out.println("------------sendEmail");
    }

    public static synchronized void sendSms(){
    	System.out.println("------------sendSMS");
    }

    public void hello(){
   	 	System.out.println("hello");
    }
}

/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信Email
*2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信Email
*3.新增普通的hello方法,請問先打印郵件還是hellohello
*4.兩部手機,請問先打印郵件還是短信SMS
*5.兩個靜態同步方法,1部手機,請問先打印郵件還是短信Email
*6.兩個靜態同步方法,2部手機,請問先打印郵件還是短信Email
*/
public class Lock8{
    publicstaticvoidmain(String[]args)throwsInterruptedException{
        Phone phone=new Phone();
        Phone phone2=new Phone();

        new Thread(()->{
            try{
            	phone.sendEmail();
            }catch(InterruptedException e){
           	 e.printStackTrace();
            }
        },"A").start();
        Thread.sleep(300);
        new Thread(()->{
            //phone.sendSms();
            phone2.sendSms();
            //phone.hello();
        },"B").start();

    }
}

結果:與lock5的運行結果一致,sendEmail與sendSMS都是4s后進行輸出,synchronized也是鎖住的類元信息

java中synchronized Lock(本地同步)鎖的8種情況

 

lock7

7.一個普通同步方法,一個靜態同步方法,1部手機,請問先打印Email還是SMS? 答案:SMS

原理:普通同步方法,synchronized鎖住的是當前實例對象,當前實例對象存在于jvm的堆內存區

靜態同步方法,synchronized鎖住的是當前類的類元信息,存在于jvm元空間的靜態區中

package day02_lam;

import java.util.concurrent.TimeUnit;

class Phone{
    //靜態同步方法
	public static synchronized void sendEmail()throws InterruptedException{
		TimeUnit.SECONDS.sleep(4);
		System.out.println("------------sendEmail");
	}
	
    //普通同步方法
	public synchronized void sendSms(){//無static
	
		System.out.println("------------sendSMS");
	}
	
	public void hello(){
		System.out.println("hello");
	}
}

/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信Email
*2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信Email
*3.新增普通的hello方法,請問先打印郵件還是hellohello
*4.兩部手機,請問先打印郵件還是短信SMS
*5.兩個靜態同步方法,1部手機,請問先打印郵件還是短信Email
*6.兩個靜態同步方法,2部手機,請問先打印郵件還是短信Email
*7.一個普通同步方法,一個靜態同步方法,1部手機,請問先打印郵件還是短信 SMS
*/
public class Lock8{
	public static void main(String[] args) throws InterruptedException{
		Phonephone=newPhone();
		Phonephone2=newPhone();
		
		newThread(()->{
			try{
				phone.sendEmail();
			}catch(InterruptedExceptione){
				e.printStackTrace();
			}
		},"A").start();
		
		Thread.sleep(300);
		
		newThread(()->{
			phone.sendSms();
			//phone2.sendSms();
			//phone.hello();
		},"B").start();
	
	}
}

結果:sendSMS先輸出,4s后sendEmail再輸出

java中synchronized Lock(本地同步)鎖的8種情況

 

lock8

8.一個普通同步方法,一個靜態同步方法,2部手機,請問先打印郵件還是短信? 答案:SMS

原理:與lock7一致

package day02_lam;

import java.util.concurrent.TimeUnit;

class Phone{
	public static synchronized void sendEmail()throwsInterruptedException{
		TimeUnit.SECONDS.sleep(3);
		System.out.println("------------sendEmail");
	}
	
	public synchronized void sendSms(){
	
		System.out.println("------------sendSMS");
	}
	
	public void hello(){
		System.out.println("hello");
	}
}

/**
*題目:
*1.標準訪問,請問是先打印郵件還是短信Email
*2.email方法新增暫停4秒鐘,請問是先打印郵件還是短信Email
*3.新增普通的hello方法,請問先打印郵件還是hellohello
*4.兩部手機,請問先打印郵件還是短信SMS
*5.兩個靜態同步方法,1部手機,請問先打印郵件還是短信Email
*6.兩個靜態同步方法,2部手機,請問先打印郵件還是短信Email
*7.一個普通同步方法,一個靜態同步方法,1部手機,請問先打印郵件還是短信SMS
*8.一個普通同步方法,一個靜態同步方法,2部手機,請問先打印郵件還是短信SMS
*/
public class Lock8{
	publicstaticvoidmain(String[]args)throwsInterruptedException{
		Phone phone=new Phone();
		Phone phone2=new Phone();
		
		new Thread(()->{
			try{
				phone.sendEmail();
			}catch(InterruptedExceptione){
				e.printStackTrace();
			}
		},"A").start();
		
		Thread.sleep(300);
		
		new Thread(()->{
			//phone.sendSms();
			phone2.sendSms();
			//phone.hello();
		},"B").start();
	
	}
}

結果:運行結果與lock7一致,sendSMS先輸出,4s后sendEmail再輸出

java中synchronized Lock(本地同步)鎖的8種情況

到此這篇關于java中synchronized Lock(本地同步)鎖的8種情況的文章就介紹到這了,更多相關 synchronized Lock鎖內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/A-Dun/p/15327581.html

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
主站蜘蛛池模板: 国产香蕉97碰碰久久人人 | 国产xx肥老妇视频奂费 | 91中文字幕yellow字幕网 | 日本一区二区视频免费播放 | 蜜臀91| 福利片福利一区二区三区 | 日韩精品欧美 | 久久精品动漫网一区二区 | 果冻传媒九一制片厂 | 激情影院免费观看 | 国产精品久久久久毛片真精品 | 免费在线观看成年人视频 | 91制片厂果冻传媒杨柳作品 | 亚洲va精品中文字幕 | 午夜精品在线 | 色哟哟在线播放 | 嫩草成人影院 | freexxx性欧美3d动漫 | 国产欧美日韩亚洲精品区2345 | 亚洲国产日韩成人综合天堂 | 国产精品久久久久久久久免费hd | 免费理伦片在线观看全网站 | 欧美同性videos | 欧美香蕉视频 | 国产片在线看 | 高中生放荡日记高h娜娜 | 小草视频免费观看在线 | 4tube高清性欧美 | 男人把j放进女人的p里视频 | 91亚洲专区 | 美女毛片老太婆bbb80岁 | 17岁韩国在线观看免费1 | 日韩性大片免费 | 色狠狠色狠狠综合天天 | 亚洲人成网站在线观看播放青青 | 精品国产乱码久久久久久人妻 | 亚洲国产日韩欧美在线vip1区 | 国产综合成色在线视频 | 国产图片一区 | 手机看片国产免费现在观看 | 国产资源中文字幕 |