随笔分类 - 后端
摘要:简介 1、用于交换数据 2、它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对
阅读全文
摘要:简介 控制并发数量 使用场景:接口限流 案例1 import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[] args) { // 指定个数 Semaphore
阅读全文
摘要:简介 1、允许一组线程相互等待达到一个公共的障碍点,之后再继续执行 2、跟countDownLatch的区别 CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用 CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;
阅读全文
摘要:简介 await() 进入等待的状态 countDown() 计数器减一 代码案例 import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { public static void main(String
阅读全文
摘要:简介 在并发编程中,LinkedBlockingQueue使用的非常频繁。因其可以作为生产者消费者的中间商 add() 实际上调用的是offer,区别是在队列满的时候,add会报异常 offer() 对列如果满了,直接入队失败 put("111") 在队列满的时候,会进入阻塞的状态 remove()
阅读全文
摘要:同步容器 Vector、HashTable: JDK提供的同步容器类 Collections.synchronizedXXX 本质是对相应的容器进行包装 同步容器类的缺点: 在单独使用里面的方法的时候,可以保证线程安全,但是,复合操作需要额外加锁来保证线程安全 使用Iterator迭代容器或使用使用
阅读全文
摘要:简介 1、一度认为原子是不可分割的最小单位,故原子类可以认为其操作都是不可分割 2、对多线程访问同一个变量,我们需要加锁,而锁是比较消耗性能的,JDk1.5之后,新增的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式,这些类同样位于JUC包下的atomic包下,发展到JDk1.8
阅读全文
摘要:简介 1、可以在一个锁里面,存在多种等待条件 2、主要的方法: await 挂起 signal 随机唤醒1个线程 signalAll 唤醒所有等待的线程 代码案例 /** * 生产者线程 */ public class Producer implements Runnable{ private Me
阅读全文
摘要:简介 1、线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。为每个线程单独存放一份变量副本,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。只要线程处于活动状态并且ThreadLocal实例可访问,那么每个线程都拥有对其本地线程副本的隐式
阅读全文
摘要:简介 1、使用场景:线程A执行到一半,需要一个数据,这个数据需要线程B去执行修改,只有B修改完成之后,A才能继续操作 2、线程A的run方法里面,调用线程B的join方法,这个时候,线程A会等待线程B运行完成之后,再接着运行 代码案例 public class Main { public stati
阅读全文
摘要:简介 以内存为媒介,用于线程之间的数据传输 面向字节:PipedOutputStream、PipedInputStream 面向字符:PipedReader、PipedWriter 代码案例 public class Reader implements Runnable{ // 注入输入流 priv
阅读全文
摘要:wait、notify、notifyAll 简介 1、在多线程环境下,有时候一个线程的执行,依赖于另外一个线程的某种状态的改变,这个时候,我们就可以使用wait与notify或者notifyAll 2、wait跟sleep的区别:wait会释放持有的锁,而sleep不会,sleep只是让线程在指定的
阅读全文
摘要:简介 1、一般应用,都是读多写少,ReentrantReadWriteLock 因读写互斥,故读时阻塞写,因而性能上上不去。可能会使写线程饥饿 2、StampedLock的特点 所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功; 所有释放锁的方法,都需要一个
阅读全文
摘要:简介 1、锁降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性 2、锁降级之后,写锁并不会直接降级成读锁,不会随着读锁的释放而释放,因此需要显式地释放写锁 3、锁降级的应用场景:用于对数据比较敏感,需要在对数据修改之后,获取到修改后的值,并进行接
阅读全文
摘要:查看案例 public void inCreate() { writeLock.lock(); try { i++; Thread.sleep(500L); j++; } catch (InterruptedException e) { e.printStackTrace(); }finally {
阅读全文
摘要:查看类的关系 查看读锁方法 public void out(){ readLock.lock(); try { System.out.println(Thread.currentThread().getName()+"i的值 》"+i + "j的值 》"+j); }finally { readLoc
阅读全文
摘要:查看源码 # ctrl + 点击ReentrantReadWriteLock abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 63
阅读全文
摘要:读写锁特性 特性:写写互斥、读写互斥、读读共享 锁降级:写线程获取写入锁后可以获取读取锁,然后释放写入锁,这样就从写入锁变成了读取锁,从而实现锁降级的特性 案例1 public class ReentrantReadWriteLockDemo { private int i = 0; private
阅读全文
摘要:案例 public class ReentrantLockDebugDemo { // 变量i private int i = 0; // new1个reentrantLock private ReentrantLock reentrantLock = new ReentrantLock(); //
阅读全文
摘要:公平锁与非公平锁的区别 公平锁:所有线程都老老实实排队 非公平锁:只要有机会,就先尝试抢占资源 非公平锁的弊端 可能导致后面排队等待的线程等不到相应的cpu资源,从而引起线程饥饿 源码解析 public class ReentrantLockDemo { public static void mai
阅读全文
浙公网安备 33010602011771号