
并发
文章平均质量分 59
学习记录
crazyK.
代码小白
展开
-
线程池(通俗易懂)
目录一、什么是线程池二、创建线程池的方式三、线程池的七大参数四、四种拒绝策略1.AbortPolicy()2.CallerRunsPolicy()3.DiscardPolicy()4.DiscardOldestPolicy()五、自定义一个线程池1.场景描述2.代码实现一、什么是线程池线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务...原创 2022-04-22 16:20:49 · 12835 阅读 · 0 评论 -
阻塞队列BlockingQueue
一、什么是阻塞队列从名字可以看出阻塞队列是队列的一种,是一种FIFO(先进先出)的数据结构,与普通队列不同的是,它支持阻塞添加和阻塞删除阻塞添加:当队列已满时,往队列中添加元素会阻塞等待阻塞删除:当队列为空时,往队列中删除或获取元素将被阻塞二、阻塞队列的四组API方式 抛出异常 不会抛出异常,有返回值 阻塞等待 超时等待 添加 add() offer() put() offer(e,timeout,Tim...原创 2022-04-21 12:45:12 · 1225 阅读 · 0 评论 -
读写锁ReadWriteLock
在jdk帮助文档中是这么说的:A ReadWriteLock维护一对关联的locks,一个用于只读操作,一个用于写操作。read lock可以由多个阅读器同时进行,只要没有作者 write lock 是独家的意思就是读操作可以被多个线程同时读,写操作只能由一个线程去写ReadWriteLock同Lock一样也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个是只读的锁,一个是写锁。ReentranReadWriteLock是其...原创 2022-04-19 13:53:01 · 2195 阅读 · 0 评论 -
ArrayList、HashSet线程不安全集合
一、不安全示例ArrayList是java集合框架中一个重要的类,是一个长度可变的集合。在多线程环境下的操作ArrayList是不安全的,会抛出并发修改异常ConcurrentModificationException。话不多说,上示例:在for循环中new了十个线程,每一个线程都向list中添加元素public class ListTest { public static void main(String[] args) { List<String> li原创 2022-04-15 16:27:18 · 2940 阅读 · 0 评论 -
Condition精准唤醒和通知
关键字synchornized可以使用wait()和notify()方法实现等待/通知模式,在类ReentrantLock中也可以实现相同的功能,但需要借助java.util.concurrent.locks 下的Condition对象。使用Condition比synchornized拥有更好的灵活性,它可以在一个Lock对象中创建多个实例,线程对象可以在指定的Condition对象中选择性的进行线程通知,在下线程调度上更为灵活在使用wait()和no...原创 2022-04-15 14:56:40 · 3131 阅读 · 0 评论 -
Synchronized和lock锁的区别
锁 Synchronized lock 层级 java关键字,在jvm层面上 一个类 锁的释放 锁中的同步代码块执行完后会释放锁 使用try{}catch{}finally{}手动释放 锁的获取 线程1获取锁之后,线程2会进行等待 Lock类中有一个tryLock()方法,尝试获取锁,lock锁的线程不一定需要等待 锁状态 无法判断 可以判断 锁类型 可重入锁、不可中断、非公平锁 可重入锁、可判断、非公平锁/...原创 2022-04-12 15:03:41 · 329 阅读 · 0 评论 -
生产者消费者问题
一、场景 假设容器中只能存放一件物品,生产者将生产出的产品放入容器,消费者将从容器产品取走消费 如果容器中没有产品,则生产者将产品放入容器,,否则停止生产并等待,直到容器中的产品被消费者取走为止 如果容器中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到容器中再次放入产品为止 对于生产者,没有生产产品之前,要通知消费者等待。而生产了产品之后,又需要马上通知消费者消费 对于消费者,在消费之后,要通知生产者已经结束消费,需要生产新的产品以供消费原创 2022-04-08 15:59:31 · 329 阅读 · 0 评论 -
限流算法详解
一、什么是限流限流是指在高并发、大流量请求的情况下,限制新的流量对系统的访问,从而保证系统服务的安全性。限流可以应对:热点业务带来的突发请求;调用方bug导致的突发请求;恶意攻击请求二、为什么要分布式限流当应用为单点应用时,只要应用进行了限流,那么应用所依赖的各种服务也得到了保护。但线上的业务出于各种原因考虑,多是分布式系统,单点的限流仅能保护自身节点,但无法保护应用依赖的各种服务,并且在进行节点扩容缩容时也无法整个服务的请求限制。而如果实现了分布式限流,那么就可以方便的控制...原创 2022-04-07 10:57:06 · 1398 阅读 · 0 评论 -
类锁和对象锁
类锁 如果有n个加锁的静态方法,在多线程情况下,其中一个线程访问了这个类的某个静态方法,则这个类其他加锁的静态方法不能被访问,要等被访问的那个方法彻底执行完,其他方法才可被调用,不加锁的方法不参与public class Person { public static synchronized void m1(String a) throws InterruptedException { System.out.println(a+"开始m1"); ...原创 2022-04-01 14:54:30 · 1845 阅读 · 0 评论 -
轻量锁volatile
volatile是轻量级的读锁,它在多处理器开发中保证了共享变量的可见性volatile保证读的准确性,只能修饰属性(变量)public class liN { private volatile int a = 1; }可见性:在多线程高速缓存时,一个线程修改后,volatile将其他线程也进行修改,保证修改后其他线程读到的数据是修改后的如果一个字段被声明成volatile,java线程模型确保所有线程看到这个变量的值是一致的有volatile变量修饰...原创 2022-04-01 10:36:51 · 4536 阅读 · 0 评论 -
死锁(含java代码示例)
一、什么是死锁死锁指多个进程在运行过程中因争夺资源而造成的一种僵局,若进程处于这种状态时,若无外力作用,它们都无法再向前推进。此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。erpublic class DeadLockDemo { private static String A = "A"; private static String B = "B"; public stat...原创 2022-03-31 17:36:14 · 953 阅读 · 0 评论 -
线程和进程
一、线程和进程的区别线程是调度的基本单位进程是资源分配的基本单位线程组成进程,进程包含线程,一个进程可以有多个线程,进程的规模大于线程二、线程我们一个类中的主方法就是主线程,主线程中可以包含多个子线程,各个线程没有包含关系,互相独立,互不依赖,如下public class mTest { public static void main(String[] args) throws InterruptedException { System.ou...原创 2022-03-31 11:16:32 · 632 阅读 · 0 评论 -
主从哨兵模式 + 抗并发策略
一、主从策略的由来也叫主从容灾策略,在大型企业中,当某个项目并发访问量过高时,会导致数据库压力过大,主从策略就是为了解决这一问题诞生的二、主从策略介绍在主从哨兵模式的部署下,服务器会分为三部分,主数据库,从数据库,哨兵主数据库:负责整个系统的读写操作从数据库:负责整个数据库的读操作哨兵:监控主数据库和从数据库,观察他们能否正常运行;选举功能,决定谁来做主数据库当某个项目并发访问量过大时,可能会导致主数据库崩溃,这是从数据库会顶上来代......原创 2022-03-28 18:16:26 · 5649 阅读 · 0 评论