synchronized 关键字及使用

synchronized 锁重入

关键字synchronized锁重入的功能,也就是在使用synchronized 时,当一个线程得到了一个对象的锁后,再次请求此对象时是可以再次得到该对象的锁  示例代码如下

public class SyncDubbo1 {

	public synchronized void method1(){
		System.out.println("method1");
		method2();
	}
	
	public synchronized void method2(){
		System.out.println("method2");
		method3();
	}
	
	public synchronized void method3(){
		System.out.println("method3");
	}
	
	public static void main(String[] args) {
		final SyncDubbo1 sDubbo1 = new SyncDubbo1();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				sDubbo1.method1();
			}
		});
		t1.start();
	}
}

 父子类继承关系时 

public class SyncDubbo2 {

	
	static class Main{
		public int i = 10;
		public synchronized void operatorSup(){
			try {
				i--;
				System.out.println("Main print i = "+i);
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	static class Sub extends Main{
		public synchronized void operatorSub(){
			try {
				while (i>0) {
					i--;
					System.out.println("Sub print i = "+i);
					Thread.sleep(100);
					this.operatorSup();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				Sub sub = new Sub();
				sub.operatorSub();
			}
		});
		t1.start();
	}
}

 对象锁 使用示例

public class ObjectLock {

	public void method1(){
		synchronized (this) {	//对象锁
			try {
				System.out.println("do method1..");
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void method2(){		//类锁
		synchronized (ObjectLock.class) {
			try {
				System.out.println("do method2..");
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	private Object lock = new Object();
	public void method3(){		//任何对象锁
		synchronized (lock) {
			try {
				System.out.println("do method3..");
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		
		final ObjectLock objLock = new ObjectLock();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				objLock.method1();
			}
		});
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				objLock.method2();
			}
		});
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				objLock.method3();
			}
		});
		
		t1.start();
		t2.start();
		t3.start();
	}
	
}

 尽量避免使用 字符串对象 做为锁对象 

猜你喜欢

转载自xdx2599.iteye.com/blog/2306769