网站的数据库是什么,定制公交app下载,智能建站系统怎么更换网站模板,上海网站制作网文章目录 前言ReentrantLock原子类线程池信号量CountDownLatch相关面试题 前言
经过前面文章的学习我们大致了解了如何实现多线程编程和解决多线程编程中遇到的线程不安全问题#xff0c;java.util.concurrent 是我们多线程编程的一个常用包#xff0c;那么今天我将为大家分… 文章目录 前言ReentrantLock原子类线程池信号量CountDownLatch相关面试题 前言
经过前面文章的学习我们大致了解了如何实现多线程编程和解决多线程编程中遇到的线程不安全问题java.util.concurrent 是我们多线程编程的一个常用包那么今天我将为大家分享 java.util.concurrent 包下的其他几种常见的类。
ReentrantLock
ReentrantLock 是可重入互斥锁跟 synchronized 定位是类似的都是用来保证线程安全的但是 ReentrantLock 在某些方面相较于 synchronized 有突出的优势。
ReentrantLock 的加锁方式分为两种
lock()如果获取不到锁线程就会进入阻塞等待状态tryLock()如果获取不到锁就会放弃加锁而不是进入阻塞等待状态
使用 ReentrantLock 的时候需要手动 unLock() 解锁如果忘记了手动解锁这个操作将会带来比较严重的后果。
所以为了解决有些时候忘记手动解锁的情况往往需要借助 try-finally 来进行解锁操作。
ReentrantLock lock new ReentrantLock();
lock.lock();
try {//working
}finally {lock.unlock();
}ReentranLock 与 synchronized 相比的优势 ReentrantLock 在加锁的时候有两种方式lock() 和tryLock()。使用 lock() 的时候如果未获取到锁就会进入阻塞等待状态而使用 tryLock() 的话如果没有获取到锁就会放弃获取而不是进入阻塞等待 ReentrantLock 提供了公平锁的实现默认情况下是非公平锁 ReentranLock 提供了更强大的等待通知机制搭配了Condition类实现等待通知可以指定唤醒某个线程
如何选择使用哪个锁?
锁竞争不激烈的时候, 使用 synchronized, 效率更高, 自动释放更方便.锁竞争激烈的时候, 使用 ReentrantLock, 搭配 trylock 更灵活控制加锁的行为, 而不是死等.如果需要使用公平锁, 使用 ReentrantLock.
通常情况下还是建议使用 synchronized虽然 ReentrantLock 在某些方面具有优势但是使用起来较麻烦并且Java程序员在 synchronized 里面做了很多的优化。
原子类
原子类内部都是使用 CAS 操作实现的因为 CAS 操作时原子性的不需要进行加锁操作所以性能要比加锁好很多。
AtomicBooleanAtomicIntegerAtomicIntegerArrayAtomicLongAtomicReferenceAtomicStampedReference
原子类常见方法
addAndGet(int delta); —— i delta;decrementAndGet(); —— --i;getAndDecrement(); —— i–;incrementAndGet(); —— i;getAndIncrement(); —— i;
CAS 操作我在前面详细讲解过大家想要了解的话可以去看看。CAS(Compare And Swap)操作
线程池
线程池是为了解决因线程频繁创建和销毁而造成的资源浪费问题。
使用线程池需要使用到 ExecutorService 和 Executors 两个类。
ExecutorService pool Executors.newFixedThreadPool(10);
pool.submit(new Runnable() {Overridepublic void run() {System.out.println(hello);}
});ExecutorService 表示一个线程池实例.Executors 是一个工厂类, 能够创建出几种不同风格的线程池.ExecutorService 的 submit 方法能够向线程池中提交若干个任务
Executors 创建线程池的几种方式
newFixedThreadPool: 创建固定线程数的线程池newCachedThreadPool: 创建线程数目动态增长的线程池.newSingleThreadExecutor: 创建只包含单个线程的线程池.newScheduledThreadPool: 设定 延迟时间后执行命令或者定期执行命令. 是进阶版的 Timer。
这里面也涉及到了工厂模式大家可以去看看这篇文章了解一下【JavaEE】多线程案例-线程池
信号量
信号量Semaphore是一种实现任务间通信的机制可以用于实现任务之间的同步或临界资源的互斥访问。它通常被用于协助一组相互竞争的任务来访问临界资源。
信号量是一个非负整数获取信号量的任务会将该整数减1。当信号量为0时所有试图获取该信号量的任务都将处于阻塞状态。信号量的值代表积累下来的释放信号量操作的次数。
申请资源的操作被称为 P 操作释放资源的操作被称为 V 操作。
信号量可以分为二值信号量和计数信号量两种。二值信号量只有一个消息队列队列有两种状态空或满。而计数信号量可以看做长度大于1的消息队列用于计数。信号量的计数值表示还有多少个事件未被处理。当某个事件发生时任务或中断会释放一个信号量将信号量计数值加1当需要处理某个事件时任务或中断会取走一个信号量将信号量计数值减1。
加锁和解锁的操作就可以看成是二值信号量的操作当加锁的时候信号量就为0释放锁的时候信号量就为1.
在Java代码中信号量相关的操作被封装在 Semaphore 类中acquire() 方法表示申请资源release() 方法表示释放资源。
public class Test2 {public static void main(String[] args) throws InterruptedException {Semaphore semaphore new Semaphore(4);semaphore.acquire();System.out.println(获取资源);semaphore.acquire();System.out.println(获取资源);semaphore.acquire();System.out.println(获取资源);semaphore.acquire();System.out.println(获取资源);semaphore.acquire();System.out.println(获取资源);semaphore.release();System.out.println(释放资源);}
}当申请的资源量大于总的资源量的时候线程就会进入阻塞等待状态直到其他线程释放掉部分信号量。
CountDownLatch
CountDownLatch是Java中的一个同步工具类用来协调多个线程之间的同步。它允许一个或多个线程等待直到在其他线程中执行的一组操作完成。
CountDownLatch通过一个计数器来实现这个功能计数器的初始值通常设置为需要等待完成的线程数量。每当一个线程完成了自己的任务计数器的值就会减1。当计数器的值达到0时表示所有线程都已经完成任务此时在CountDownLatch上等待的线程就可以恢复执行。
CountDownLatch可以用来确保某些活动在其他活动完成之前不会继续执行。例如可以确保某个计算在其需要的所有资源都被初始化之后才继续执行或者确保某个服务在其依赖的所有其他服务都已经启动之后才启动。
在Java中可以使用CountDownLatch的countDown()方法来对计数器做减操作就是告诉CountDownLatch我这个当前的任务完成了使用await()方法等待计数器达到0。所有调用await()方法的线程都会被阻塞直到计数器达到0或者等待线程被中断或者超时。
public class Demo2 {private static int count;public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch new CountDownLatch(10);for(int i 0; i 10; i) {Thread t new Thread(() - {try {Thread.sleep((long)(Math.random() * 4000));System.out.println(count 号完成比赛);countDownLatch.countDown();} catch (InterruptedException e) {throw new RuntimeException(e);}});t.start();}countDownLatch.await();System.out.println(结束比赛);}
}只有调用了10次 countDown() 方法之后await() 方法才会结束等待继续执行后面的代码。
需要注意的是CountDownLatch是一次性的一旦计数器的值达到0就不能再次使用。如果需要多次使用类似的功能可以考虑使用CyclicBarrier等其他同步工具类。
相关面试题
1) 线程同步的方式有哪些
synchronized, ReentrantLock, Semaphore 等都可以用于线程同步.
2) 为什么有了 synchronized 还需要 juc 下的 lock
以 juc 的 ReentrantLock 为例,
synchronized 使用时不需要手动释放锁. ReentrantLock 使用时需要手动释放. 使用起来更灵活,synchronized 在申请锁失败时, 会死等. ReentrantLock 可以通过 trylock 的方式等待一段时间就放弃.synchronized 是非公平锁, ReentrantLock 默认是非公平锁. 可以通过构造方法传入一个 true 开启公平锁模式.synchronized 是通过 Object 的 wait / notify 实现等待-唤醒. 每次唤醒的是一个随机等待的线程. ReentrantLock 搭配 Condition 类实现等待-唤醒, 可以更精确控制唤醒某个指定的线程.
3) AtomicInteger 的实现原理是什么
基于 CAS 机制. 伪代码如下:
class AtomicInteger {private int value;public int getAndIncrement() {int oldValue value;while ( CAS(value, oldValue, oldValue1) ! true) {oldValue value;}return oldValue;}
}4) 信号量听说过么之前都用在过哪些场景下
信号量, 用来表示 “可用资源的个数”. 本质上就是一个计数器.
使用信号量可以实现 “共享锁”, 比如某个资源允许 3 个线程同时使用, 那么就可以使用 P 操作作为加锁, V 操作作为解锁, 前三个线程的 P 操作都能顺利返回, 后续线程再进行 P 操作就会阻塞等待,直到前面的线程执行了 V 操作 文章转载自: http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.gwtbn.cn.gov.cn.gwtbn.cn http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.gskzy.cn.gov.cn.gskzy.cn http://www.morning.gdpai.com.cn.gov.cn.gdpai.com.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.fhqdb.cn.gov.cn.fhqdb.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.dmwck.cn.gov.cn.dmwck.cn http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn http://www.morning.xsbhg.cn.gov.cn.xsbhg.cn http://www.morning.qmtzq.cn.gov.cn.qmtzq.cn http://www.morning.ydwnc.cn.gov.cn.ydwnc.cn http://www.morning.drkk.cn.gov.cn.drkk.cn http://www.morning.qhkx.cn.gov.cn.qhkx.cn http://www.morning.prfrb.cn.gov.cn.prfrb.cn http://www.morning.swlwf.cn.gov.cn.swlwf.cn http://www.morning.thnpj.cn.gov.cn.thnpj.cn http://www.morning.qlpyn.cn.gov.cn.qlpyn.cn http://www.morning.qpsft.cn.gov.cn.qpsft.cn http://www.morning.tsflw.cn.gov.cn.tsflw.cn http://www.morning.hdpcn.cn.gov.cn.hdpcn.cn http://www.morning.dnpft.cn.gov.cn.dnpft.cn http://www.morning.jljwk.cn.gov.cn.jljwk.cn http://www.morning.rbknf.cn.gov.cn.rbknf.cn http://www.morning.blzrj.cn.gov.cn.blzrj.cn http://www.morning.mpwgs.cn.gov.cn.mpwgs.cn http://www.morning.mztyh.cn.gov.cn.mztyh.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.wnhml.cn.gov.cn.wnhml.cn http://www.morning.mjxgs.cn.gov.cn.mjxgs.cn http://www.morning.pkggl.cn.gov.cn.pkggl.cn http://www.morning.fhqsm.cn.gov.cn.fhqsm.cn http://www.morning.cnkrd.cn.gov.cn.cnkrd.cn http://www.morning.ghyfm.cn.gov.cn.ghyfm.cn http://www.morning.rxrw.cn.gov.cn.rxrw.cn http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn http://www.morning.zbmcz.cn.gov.cn.zbmcz.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.pqxjq.cn.gov.cn.pqxjq.cn http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn http://www.morning.rhlhk.cn.gov.cn.rhlhk.cn http://www.morning.xrwbc.cn.gov.cn.xrwbc.cn http://www.morning.fsjcn.cn.gov.cn.fsjcn.cn http://www.morning.zpzys.cn.gov.cn.zpzys.cn http://www.morning.kxyqy.cn.gov.cn.kxyqy.cn http://www.morning.ctsjq.cn.gov.cn.ctsjq.cn http://www.morning.nlglm.cn.gov.cn.nlglm.cn http://www.morning.gzxnj.cn.gov.cn.gzxnj.cn http://www.morning.bsrp.cn.gov.cn.bsrp.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.rbrhj.cn.gov.cn.rbrhj.cn http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn http://www.morning.tgdys.cn.gov.cn.tgdys.cn http://www.morning.knzdt.cn.gov.cn.knzdt.cn http://www.morning.kpyyf.cn.gov.cn.kpyyf.cn http://www.morning.woyoua.com.gov.cn.woyoua.com http://www.morning.wschl.cn.gov.cn.wschl.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.spdyl.cn.gov.cn.spdyl.cn http://www.morning.wmfny.cn.gov.cn.wmfny.cn http://www.morning.bpzw.cn.gov.cn.bpzw.cn http://www.morning.dpbdq.cn.gov.cn.dpbdq.cn http://www.morning.mywmb.cn.gov.cn.mywmb.cn http://www.morning.jzykq.cn.gov.cn.jzykq.cn http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn http://www.morning.sqtsl.cn.gov.cn.sqtsl.cn http://www.morning.nyplp.cn.gov.cn.nyplp.cn http://www.morning.jkpnm.cn.gov.cn.jkpnm.cn http://www.morning.ckfqt.cn.gov.cn.ckfqt.cn http://www.morning.jrpmf.cn.gov.cn.jrpmf.cn http://www.morning.mtgnd.cn.gov.cn.mtgnd.cn http://www.morning.lbcbq.cn.gov.cn.lbcbq.cn http://www.morning.qstkk.cn.gov.cn.qstkk.cn http://www.morning.qhydkj.com.gov.cn.qhydkj.com http://www.morning.tnkwj.cn.gov.cn.tnkwj.cn