1.重入锁默认采用非公平策略,效率高,也可以通过参数true指定为公平 2.重入锁必须要释放,一般为了防止锁释放不了,会将释放代码放入finnally中 3.synchronized释放是由jvm完成
package cn.tedu.lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Demo1 { public static String name = "璐璐"; public static String gender = "女"; public static void main(String[] args) { Lock lock = new ReentrantLock(); new Thread(new Run3(lock)).start(); new Thread(new Run4(lock)).start(); } } class Run3 implements Runnable{ private Lock lock; public Run3(Lock lock){ this.lock = lock; } @Override public void run() { while(true){ lock.lock(); if("璐璐".equals(Demo1.name)){ Demo1.name = "苏苏"; Demo1.gender = "男"; } else{ Demo1.name = "璐璐"; Demo1.gender = "女"; } lock.unlock(); } } } class Run4 implements Runnable{ private Lock lock; public Run4(Lock lock){ this.lock = lock; } @Override public void run() { while(true){ lock.lock(); System.out.println(Demo1.name+":"+Demo1.gender); lock.unlock(); } } }分为读锁和写锁 写锁只能一个线程操作 读锁可以并发 锁的更细粒度控制,为了提高效率 场景:读多写少
package cn.tedu.lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriterDemo { public static String name = "璐璐"; public static String gender = "女"; public static void main(String[] args) { ReadWriteLock lock = new ReentrantReadWriteLock(); new Thread(new Run5(lock)).start(); new Thread(new Run6(lock)).start(); } } class Run5 implements Runnable{ private ReadWriteLock lock; public Run5(ReadWriteLock lock){ this.lock = lock; } @Override public void run() { while(true){ lock.writeLock().lock();; if("璐璐".equals(Demo1.name)){ Demo1.name = "苏苏"; Demo1.gender = "男"; } else{ Demo1.name = "璐璐"; Demo1.gender = "女"; } lock.writeLock().unlock(); } } } class Run6 implements Runnable{ private ReadWriteLock lock; public Run6(ReadWriteLock lock){ this.lock = lock; } @Override public void run() { while(true){ lock.readLock().lock(); System.out.println(Demo1.name+":"+Demo1.gender); lock.readLock().unlock(); } } }