注意:Synchronized是同一把锁
Lock是不同的锁,但是解锁必须一一对应。
可重入锁(递归锁)
Synchronized
public class Demo01 {public static void main(String[] args) {Phone phone = new Phone();new Thread(()->{phone.sms();},"A").start();new Thread(()->{phone.sms();},"B").start();}}class Phone{public synchronized void sms(){System.out.println(Thread.currentThread().getName() + "sms");call(); // 这里也有锁}public synchronized void call(){System.out.println(Thread.currentThread().getName() + "call");}}
Lock 版
import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Demo02 {public static void main(String[] args) {Phone2 phone = new Phone2();new Thread(()->{phone.sms();},"A").start();new Thread(()->{phone.sms();},"B").start();}}class Phone2{Lock lock = new ReentrantLock();public void sms(){lock.lock(); // 细节问题:lock.lock(); lock.unlock(); // lock 锁必须配对,否则就会死在里面lock.lock();try {System.out.println(Thread.currentThread().getName() + "sms");call(); // 这里也有锁} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();lock.unlock();}}public void call(){lock.lock();try {System.out.println(Thread.currentThread().getName() + "call");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}
