1. 程式人生 > >Java 多執行緒學習筆記(五)synchronized 鎖重入

Java 多執行緒學習筆記(五)synchronized 鎖重入

關鍵字synchronized 擁有鎖重入的功能,也就是使用synchronized時,當一個執行緒得到一個物件鎖後,再次請求此物件鎖時是可以再次得到該物件的鎖的。這也就證明在一個synchronized方法/快的內部呼叫本類的其他的synchronized方法/快時,是永遠可以得到鎖的。

package extthread;

import myservice.Service;

public class MyThread extends Thread {
	@Override
	public void run() {
		Service service = new Service();
		service.service1();
	}

}

package myservice;

public class Service {

	synchronized public void service1() {
		System.out.println("service1");
		service2();
	}

	synchronized public void service2() {
		System.out.println("service2");
		service3();
	}

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

}
package test;

import extthread.MyThread;

public class Run {
	public static void main(String[] args) {
		MyThread t = new MyThread();
		t.start();
	}
}
可重入鎖也支援在父子類繼承的環境中。
package extthread;

import myservice.Main;
import myservice.Sub;

public class MyThread extends Thread {
	@Override
	public void run() {
		Sub sub = new Sub();
		sub.operateISubMethod();
	}

}

package myservice;

public class Main {

	public int i = 10;

	synchronized public void operateIMainMethod() {
		try {
			i--;
			System.out.println("main print i=" + i);
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

package myservice;

public class Sub extends Main {

	synchronized public void operateISubMethod() {
		try {
			while (i > 0) {
				i--;
				System.out.println("sub print i=" + i);
				Thread.sleep(100);
				this.operateIMainMethod();
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
package test;

import extthread.MyThread;

public class Run {
	public static void main(String[] args) {
		MyThread t = new MyThread();
		t.start();
	}
}

此實驗說明,當存在父子關係時,子類完全可以通過可重入鎖呼叫父類的同步方法。

相關推薦

Java 執行學習筆記synchronized

關鍵字synchronized 擁有鎖重入的功能,也就是使用synchronized時,當一個執行緒得到一個物件鎖後,再次請求此物件鎖時是可以再次得到該物件的鎖的。這也就證明在一個synchroniz

Java執行學習筆記

1、原子性:操作不能被打斷,要麼成功要麼失敗。i++ 不是原子操作。 2、可見性:一個執行緒修改了資料,其他執行緒立刻可見。 3、順序性: 4、volatile 保證程式的可見性,和順序性。不能保證對複合操作(如i++)的原子性。 javap -v xxx.class

Java執行學習筆記之中斷中的Interrupt,interrupted(),isInterrupted()

1、關於中斷 在Java中中斷最初是通過stop()來終止執行緒的,後來發現這樣簡單粗暴的停止執行緒會產生很多問題(例如物件monitor的釋放),所以改為deprecated,推薦使用interrupt()來中斷執行緒。而對於執行緒來說,會持有一個inter

java執行學習筆記高階

1.程序和程序之間的記憶體是獨立的。 2.多程序的程式是為了提高CPU的使用率。 3.多執行緒不是為了提高執行速度,而是為了提高應用程式的使用率。 4.執行緒和執行緒共享“堆記憶體和方法區記憶體”,棧記憶體是獨立的也就是說一個執行緒一個棧。 5.關於java程式的執行原理:

Java 執行 學習筆記停止執行的幾種方法

1.異常法: package test; import exthread.MyThread; import exthread.MyThread; public class Run { pu

Java 執行學習筆記資料型別String的常量池特性

將synchronized(String)與String 混合使用時需要注意String的常量池特性帶來的影響 package extthread; import service.Service;

Java 執行學習筆記十一 單例設計模式延遲載入/懶漢模式DCL解決執行安全問題

package extthread; import test.MyObject; public class MyThread extends Thread { @Override publi

執行學習筆記

一. 新建執行緒(兩種方法) 第一種:繼承Thread 1.定義一個類繼承Thread 2.該類重寫run方法。其中的getName是獲取執行緒名方法;有參構造可以在新建時指定執行緒名 3.建立子類物件就是建立新執行緒 4.子類物件呼叫start方法 ,開啟執行

執行學習筆記之單例模式中的執行問題

在某些情況下,每個類只需要一個例項,單例模式就是保證在整個應用程式的生命週期中,任何一個時刻,單例類的例項都只存在一個(當然也可以不存在),核心點: 將採用單例模式的類的構造方法私有化(private修飾) 在其內部產生該類的例項化物件,並將其封裝成priv

Java 執行詳解------執行的宣告週期

這篇部落格介紹執行緒的生命週期。   執行緒是一個動態執行的過程,它也有從建立到死亡的過程。 在 Thread 類中,有一個列舉內部類:    上面的資訊以圖片表示如下:   第一張圖:      第二張圖:把等待、計時等待、阻塞看成阻塞一個狀態了    1、新建狀態(new):使用 new 建立一個

JAVA執行學習心得

今天看了併發實踐這本書的ReentantLock這章,感覺對ReentantLock還是不夠熟悉,有許多疑問,所有在網上找了很多文章看了一下,總體說的不夠詳細,重點和焦點問題沒有談到,但這篇文章相當不錯,說的很全面,主要的重點都說到了,所有在這裡轉載了這篇文章,注意紅色字

執行學習筆記執行安全問題

執行緒安全問題的現象 首先讓我們考慮一個問題: class Demo implements Runnable{ private int num = 100; //實現Runnable介面,覆蓋run方法 public void r

執行學習筆記1

1.執行緒的建立 兩種方式:繼承Thread類,實現Runnable介面 繼承Thread類:重寫run方法 實現Runnable介面:實現run方法,同時需在宣告時飲用Thread類構造方法來成為真正的執行緒物件。 實現Runnable介面的好處是:若所定義的類已經是其他

Java執行學習筆記() 使用Condition實現等待/通知

使用Condition實現等待/通知 1. 使用Condition 1.1 MyService 1.2 ThreadA 1.3 Test 1.4 執行結果 1.5 方法對比 2. 使用多個Condition實

Java執行學習筆記(六) synchronized(this)同步語句塊

synchronized (this)同步語句塊 1. 一半非同步,一半同步 1.1 Task 1.2 ThreadA 1.3 ThreadB 1.4 Test 1.5 執行結果 2. synchronize

Java執行學習筆記(四) 使用ReentrantLock實現同步

1. 測試1 1.1 MyService import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MyService { pr

Java執行學習筆記(三) wait/notify

1.wait() wait()的作用是使當前執行程式碼的執行緒進行等待, 知道接到通知(notify)或者中斷為止 wait()是Object類的方法 當執行緒處於wait,呼叫interrupt()會出現InterruptedException 在呼叫wait

Java執行學習筆記(二) synchronized同步方法-防止髒讀

1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName = "wang don

Java執行學習筆記(一) synchronized同步方法

synchronized同步方法 1.提出問題-例項變數非執行緒安全 1.1 何為非執行緒安全? 1.2 舉例 1.2.1 有私有變數的類HasPrivateNum (供多執行緒們去呼叫) 1.2.2 執行緒A

Java執行學習筆記22之增補拾遺

詳細程式碼見:github程式碼地址   第七章 本章內容: 1. 執行緒組的使用 2. 如何切換執行緒的狀態 3. SimpleDateFormat類與多執行緒的解決方案 4. 如何處理執行緒的異常 執行緒的狀態 執行緒物件在不同的執行時期有不同的狀態