Synchronized 锁重入分析及Demo实现

关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是再次得到该对象的锁的,这也证明在一个synchronized方法 / 块内部调用本类的其他synchronized方法 / 块时,是永远可以得到锁的。

“可重入锁”的概念是:自己可以再次获取自己的内部锁。

Demo代码如下:

public class DemoServiceReentrenceLock {
	synchronized public void service1() {
		try {
			System.out.println(Thread.currentThread().getName()+ " - " +"service1 获取锁" + " - " + System.nanoTime());
			System.out.println(Thread.currentThread().getName()+ " - " +"service1" + " - " + System.currentTimeMillis());
			Thread.sleep(5000);
			service2();
			System.out.println(Thread.currentThread().getName()+ " - " +"service1 释放锁" + " - " + System.nanoTime());
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	synchronized public void service2() {
		try {
			System.out.println(Thread.currentThread().getName()+ " - " +"service2 获取锁" + " - " + System.nanoTime());
			System.out.println(Thread.currentThread().getName()+ " - " +"service2" + " - " + System.currentTimeMillis());
//			Thread.sleep(3000);
			service3();
			System.out.println(Thread.currentThread().getName()+ " - " +"service2 释放锁" + " - " + System.nanoTime());
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	synchronized public void service3() {
		System.out.println(Thread.currentThread().getName()+ " - " +"service3 获取锁" + " - " + System.nanoTime());
		System.out.println(Thread.currentThread().getName()+ " - " +"service3" + " - " + System.currentTimeMillis());
		System.out.println(Thread.currentThread().getName()+ " - " +"service3释放锁" + " - " + System.nanoTime());
	}
}
public class TestDemoServiceReentrenceLock extends Thread{
	private DemoServiceReentrenceLock service;
	public TestDemoServiceReentrenceLock(DemoServiceReentrenceLock dLock) {
		this.service = dLock;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		/*
		 * 若在此处实例化对象,创建新线程时会创建新对象,每个线程操作的是不同的对象
		 */
//		DemoServiceReentrenceLock service = new DemoServiceReentrenceLock(); 
		service.service1();
	}
	
	public static void main(String[] args) {
		DemoServiceReentrenceLock demoServiceReentrenceLock = new DemoServiceReentrenceLock();
		TestDemoServiceReentrenceLock demo = new TestDemoServiceReentrenceLock(demoServiceReentrenceLock);
		
//		demo.start();
		Thread t1 = new Thread(demo);
		Thread t2 = new Thread(demo);
		Thread t3 = new Thread(demo);
		
		t1.start();
		t2.start();
		t3.start();
	}
}
//执行结果:
Thread-1 - service1 获取锁 - 463506790016015
Thread-1 - service1 - 1540134076620
Thread-1 - service2 获取锁 - 463511789963967
Thread-1 - service2 - 1540134081620
Thread-1 - service3 获取锁 - 463511790385900
Thread-1 - service3 - 1540134081620
Thread-1 - service3释放锁 - 463511790751518
Thread-1 - service2 释放锁 - 463511790895718
Thread-1 - service1 释放锁 - 463511791731904
Thread-3 - service1 获取锁 - 463511792423465
Thread-3 - service1 - 1540134081622
Thread-3 - service2 获取锁 - 463516794723832
Thread-3 - service2 - 1540134086625
Thread-3 - service3 获取锁 - 463516794978527
Thread-3 - service3 - 1540134086625
Thread-3 - service3释放锁 - 463516795099263
Thread-3 - service2 释放锁 - 463516795154724
Thread-3 - service1 释放锁 - 463516795207199
Thread-2 - service1 获取锁 - 463516796485370
Thread-2 - service1 - 1540134086627
Thread-2 - service2 获取锁 - 463521795939716
Thread-2 - service2 - 1540134091627
Thread-2 - service3 获取锁 - 463521796082209
Thread-2 - service3 - 1540134091627
Thread-2 - service3释放锁 - 463521796205930
Thread-2 - service2 释放锁 - 463521796272484
Thread-2 - service1 释放锁 - 463521796344157

猜你喜欢

转载自blog.csdn.net/u010612373/article/details/83246936