1. 程式人生 > >【面試題】sychronized中類鎖和物件鎖的區別

【面試題】sychronized中類鎖和物件鎖的區別

問:談一談sychronized中類鎖和物件鎖的區別。

答:類鎖和物件鎖是兩種不同的鎖,對靜態方法加鎖或者使用sychronized(XX.class)相當於加了類鎖,對例項方法加鎖或者採用sychronized(this或物件)相當於加了物件鎖,區別在於對於同一個類的不同例項來說,如果加了類鎖,那麼在一個執行緒獲得類鎖後,其他執行緒即使是持有同一個類的不同的例項,也得等待類鎖的釋放,因為它們競爭的都是類鎖,如果一個執行緒獲得了物件鎖,那麼持有不同物件的執行緒則可以併發執行,因為雖然競爭的都是物件鎖,但並不是同意把物件鎖。既然類鎖和物件鎖是不同的鎖,那麼一個執行緒可以同時獲取兩把鎖。

class MyThread1 extends Thread {

	private TestSychronized test;

	public MyThread1(TestSychronized test) {
		this.test = test;
	}

	@Override
	public void run() {
		test.fun1();
		test.fun3();
	}

}

class MyThread2 extends Thread {

	private TestSychronized test;

	public MyThread2(TestSychronized test) {
		this.test = test;
	}

	@Override
	public void run() {
		test.fun2();
		test.fun4();
	}
}

public class TestSychronized {

	static synchronized void fun1() {
		System.out.println(Thread.currentThread().getName() + "靜態方法鎖fun1,等待2s");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	static synchronized void fun2() {
		System.out.println(Thread.currentThread().getName() + "靜態方法鎖fun2,等待2s");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	synchronized void fun3() {
		System.out.println(Thread.currentThread().getName() + "例項方法鎖fun3,等待2s");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	synchronized void fun4() {
		System.out.println(Thread.currentThread().getName() + "例項方法鎖fun4,等待2s");
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		TestSychronized ts1 = new TestSychronized();
		TestSychronized ts2 = new TestSychronized();
		MyThread1 mt1 = new MyThread1(ts1);
		MyThread1 mt2 = new MyThread1(ts2);
//		MyThread2 mt3 = new MyThread2(ts1);
//		MyThread2 mt4 = new MyThread2(ts2);

		mt1.start();
		mt2.start();
//		mt3.start();
//		mt4.start();

		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

上面程式碼執行順序的一種情況是:

Thread-0和Thread-1要競爭類鎖,Thread-1拿到了,先執行,然後等待2s,執行完成釋放類鎖,Thread-0可以獲得類鎖,同時Thread-1可以獲取物件鎖,這兩個鎖不衝突,鎖Thread-0:fun1和Thread-1:fun3可以併發執行,Thread-0執行完fun1後,等待2s,然後執行fun3。

相關推薦

試題sychronized物件區別

問:談一談sychronized中類鎖和物件鎖的區別。 答:類鎖和物件鎖是兩種不同的鎖,對靜態方法加鎖或者使用sychronized(XX.class)相當於加了類鎖,對例項方法加鎖或者採用sychronized(this或物件)相當於加了物件鎖,區別在於對於同一個類的不同

試題連結串列、棧佇列

1.順序儲存結構 順序儲存結構,即陣列。優點:節省儲存空間,隨機存取表中元素;缺點 :插入和刪除操作需要移動元素 順序儲存結構的插入與刪除操作程式碼實現 public void insert(int data){ if (le

Objective-COC引用計數物件所有權的基本概念與用法

cocoa中的記憶體管理機制--引用計數 Cocoa中提供了一個機制來實現上面的邏輯模型,它被稱為“引用計數”或者“保留計數”。引用計數的數值表示物件有幾個“人”在使用它 每一個物件都擁有

試題多執行緒在執行過程,某個執行緒執行時,突然釋放。會發生的特殊狀態

一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**

Java試題之Object方法詳解

之前看到有人分享的面經,面試官先問Object中有什麼方法,然後再要求解釋每一次方法的作用。 先看看Object中有什麼方法 Object類是Java中所有類的基類。位於java.lang包中,一共有13個方法 方法一 Object() 即Object的構造方法 大

試題給多個無序正整數,求位數

題目:給你很多很多正整數,但它們是無序的,找出它們的中位數。 最開始就想說使用快排,先將這些整數進行排序,然後找到中位數,但又想到可能不是面試官想要的答案,於是又採用了其他方法,最終也沒完全解決出來。 【經驗總結:當面試官問了一個演算法題後,如果想不到優化一點的方法,就先

資料結構試題找N個數據最大的K個數據

    如果不限定條件的話,這個問題還是很好解決的,但是當我們要求時間複雜度為O(N),空間複雜度為O(1)時,問題就沒那麼好解決了。    簡單的思路就是,建立一個大小為K=100的小堆,調整好,然後

試題根據前序遍歷序或後序遍歷樹構造二叉樹

class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { int len = vin.si

試題劍指offer10--求一個數的二進位制數的1的個數

求一個數二進位制數中的個數 第一種方法:模除法 程式碼如下: //Q:請實現一個函式,輸入一個整數,輸出該數二進位制中的 //1的個數。例如:把9表示成二進位制是1001,有2位是1.因此,如果輸入

用Java設計一個程式,找到一個字串對稱字串的個數試題

題目要求: 用Java設計一個程式,實現一個字串的對稱個數,如字串"effeghg",有"ff","effe","ghg"這三個對稱字元,所以返回3. 我實現的思路就是遍歷這個字串, 先選定頭位置為第一個字元,然後從最後向前遍歷這個字串, 頭尾兩個字元相同,則取中間字串,

試題Python高級開發工程師試題

http ges log com .com blog mage 回復 image 線上面試題,有空整理答案,歡迎大家回復答案 【面試題】Python高級開發工程師面試題

試題LRU算法及編碼實現LRU策略緩存

max 防止 技術分享 nbsp pri value 概念 閾值 使用 概念   LRU(least recently used)就是將最近不被訪問的數據給淘汰掉,LRU基於一種假設:認為最近使用過的數據將來被使用的概率也大,最近沒有被訪問的數據將來被使用的概率比較低。

試題2018年最全Java面試通關秘籍第五套!

XA 中文分詞 coo div rop 為什麽 3.2 自旋 FQ 【面試題】2018年最全Java面試通關秘籍第五套! 原創 2018-04-26 徐劉根 Java後端技術 第一套:《2018年最全Java面試通關秘籍第一套!》 第二套:《2018年最全Java面試通

試題Java試題--基礎總結--個人學習記錄

1、Java執行緒的狀態 新建new:新建立一個執行緒物件。 就緒runnable:建立執行緒物件後呼叫start方法,此時執行緒進入可執行狀態,等待CPU的時間片,且其他所需資源已獲得。 執行running(一般不考慮這種狀態):執行緒分得CPU的時間片、資源後執行執行緒。 阻塞b

試題Java試題--技術框架--個人學習記錄

1、看過哪些開源框架的原始碼   2、為什麼要用Redis,Redis有哪些優缺點?Redis如何實現擴容?   3、Netty是如何使用執行緒池的,為什麼這麼使用   4、為什麼要使用Spring,Spring的優缺點有哪些 &

試題Java試題--技術深度--個人學習記錄

1、有沒有看過JDK原始碼,看過的類實現原理是什麼。 2、HTTP協議   TCP詳解 關於http協議 3、TCP協議   TCP詳解 關於http協議 4、一致性Hash演算法 5、JVM如何載入位元組碼檔案 loa

試題Java 2個(多個)大整數相加如何實現

之前面試阿里的時候,第四面的時候面試官讓我當他面實現這個題目, 一開始的時候問的時候 2個相加如何實現,然後我寫完了之後又問我如果是多個相加呢?面試官希望我能在實現的時候能夠考慮到各種可能性,比如多個數相加,然後等我寫完了之後,又問我有沒有更好的實現方法;以下是我的實現方法; 將待相加

試題同學的

汽車之家 1、訪問修飾符有哪幾種?有什麼的區別? 2、面向物件三大特性?在開發中怎麼體現? 3、redis有哪些資料型別? 4、資料庫索引瞭解過嗎? 5、spring mvc 一個請求的處理過程是怎麼樣的? 6、List有那些型別,內部由什麼構成? 7、從上一家公司離職的原因是什麼? 8、什麼時候能入職? 汽

JVM第六篇:Java-物件

1.類鎖和物件鎖的定義 物件鎖的定義 是針對一個物件的,它只在該物件的某個記憶體位置宣告一個標誌位標識該物件是否擁有鎖,所以它只會鎖住當前的物件。一般一個物件鎖是對一個非靜態成員變數進行syncronized修飾,或者對一個非靜態方法進行syncronized修飾。對於物件鎖,不

試題求連結串列的環入口點

環入口點:我們設A是連結串列的起點,B是環的入口點,C是環內快慢指標的相遇點。兩個快慢指標定義為slow和fast. slow走的路程:A->B->C; fast走的路程:A->B->C->B->C; 2*(x+y)=x+y+z+y