展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

随笔分类 -  后端

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

上一页 1 ··· 13 14 15 16 17 18 19 20 21 ··· 25 下一页