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(); } }
尽量避免使用 字符串对象 做为锁对象