锁-lock

mac2025-11-11  8

锁-lock

1.案例

package cn.tedu.lock; public class Demo1 { public static String name = "璐璐"; public static String gender = "女"; public static void main(String[] args) { new Thread(new Run3()).start(); new Thread(new Run4()).start(); } } class Run3 implements Runnable{ @Override public void run() { while(true){ if("璐璐".equals(Demo1.name)){ Demo1.name = "苏苏"; Demo1.gender = "男"; }else{ Demo1.name = "璐璐"; Demo1.gender = "女"; } } } } class Run4 implements Runnable{ @Override public void run() { while(true){ System.out.println(Demo1.name+" : "+Demo1.gender); } } } 结果发现性别乱套了

可以通过同步代码块解决: class Run3 implements Runnable{ @Override public void run() { while(true){ synchronized(Demo1.class){ if("璐璐".equals(Demo1.name)){ Demo1.name = "苏苏"; Demo1.gender = "男"; }else{ Demo1.name = "璐璐"; Demo1.gender = "女"; } } } } } class Run4 implements Runnable{ @Override public void run() { while(true){ synchronized(Demo1.class){ System.out.println(Demo1.name+" : "+Demo1.gender); }} } }

2.重入锁

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(); } } }

3.读写锁

分为读锁和写锁 写锁只能一个线程操作 读锁可以并发 锁的更细粒度控制,为了提高效率 场景:读多写少

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(); } } }

4.Atomic-原子性

package cn.tedu.lock; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; public class AtomicDemo { public static AtomicInteger num = new AtomicInteger(0); public static void main(String[] args) throws Exception { CountDownLatch cdl = new CountDownLatch(2); new Thread(new Run7(cdl)).start(); new Thread(new Run8(cdl)).start(); cdl.await(); System.out.println(num); } } class Run7 implements Runnable{ private CountDownLatch cdl; public Run7(CountDownLatch cdl) { this.cdl = cdl; } @Override public void run() { for(int i =0;i<100000;i++){ //获取原子的值并加1 AtomicDemo.num.getAndAdd(1); } cdl.countDown(); } } class Run8 implements Runnable{ private CountDownLatch cdl; public Run8(CountDownLatch cdl) { this.cdl = cdl; } @Override public void run() { for(int i =0;i<100000;i++){ AtomicDemo.num.getAndAdd(1); } cdl.countDown(); } }
最新回复(0)