![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java并发编程
睡醒的土豆
这个作者很懒,什么都没留下…
展开
-
JAVA并发编程-并发包工具:Condition使用及详解,实现Produce-Consume模式
Condition简介在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了。配合Object的wait()、notify()系列方法可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。Object和Condition接口的一些对比。摘自《Java并发编程的艺术》[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yk原创 2021-01-17 18:02:01 · 375 阅读 · 1 评论 -
java并发编程-并发包工具:ReadWriteLock的使用及原理讲解
readWriteLock简介 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁,描述如下:线程进入读锁的前提条件:没有其他原创 2021-01-17 16:20:00 · 170 阅读 · 0 评论 -
java并发编程-并发包工具:Exchanger使用及原理、案例源码
Exchanger简介 Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步原创 2021-01-17 12:08:35 · 188 阅读 · 0 评论 -
java并发编程-JAVA并发包工具: CyclicBarrier使用以及与CountDownLatch的区别,用CountDownLatch实现CyclicBarrier同样的功能
CyclicBarrier简介允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。A CyclicBarrier支持一个可选的Runnable命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。实现原理:在CyclicBarrier的内部定义了一个Lock对象,每当一个线程调用awa原创 2021-01-17 11:12:31 · 74 阅读 · 0 评论 -
并发编程-java并发包工具:CountDownLatch的案例使用和原理讲解,让任务多线程并行化处理,提升任务的执行效率,串行化任务改并行化
CountDownLatch简介描述如下:它是一个同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行。通过描述,可以清晰的看出,CountDownLatch的两种使用场景:场景1:让多个线程等待场景2:和让单个线程等待。CountDownLatch的使用和原理解析详细文章内容:https://zhuanlan.zhihu.com/p/958350991、CountDownLatch 概念CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。原创 2021-01-16 16:34:15 · 264 阅读 · 0 评论 -
并发编程-实现一个高并发的无锁队列(Lock-Free)
package com.ln.juc.custom;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;import ja原创 2021-01-13 16:26:30 · 275 阅读 · 0 评论 -
JAVA异常代码-事务回滚的使用方法
导入依赖<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.11.0.0</version></dependency>假设这是一个service类的片段try{//出现异常} cat.原创 2021-01-08 12:05:55 · 2035 阅读 · 0 评论 -
多线程设计模式-Active Objects设计模式
Active Objects设计模式测试异步消息的主动对象package com.ln.concurrent.chapter18;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent.chapter18 * @Name:ActiveObjectTest * @Author:linianest * @CreateTime:2021/1/4 16:17 * @version:1.0 * @Description原创 2021-01-04 18:48:48 · 144 阅读 · 1 评论 -
多线程设计模式-流水线模式(Work-Thread)
Work-Thread设计模式使用场景:流水线线程工作模式,产品零件经过几道工序,变成产品请求任务package com.ln.concurrent.chapter17;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent.chapter17 * @Name:Request * @Author:linianest * @CreateTime:2021/1/4 14:05 * @version:1.0 *原创 2021-01-04 14:54:17 · 1193 阅读 · 0 评论 -
多线程设计模式-两阶段结束设计模式(Two Phase Termination)
两个阶段结束设计模式(Two Phase Termination)线程一般结束后,线程中的数据还存在,需要释放,这样的情况为两个阶段,也就是目前所说的两阶段结束线程设计模式线程统计数据package com.ln.concurrent;import java.util.Random;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent * @Name:CounterIncrement * @Author:l原创 2021-01-04 13:52:56 · 175 阅读 · 4 评论 -
多线程设计模式-单独线程处理请求设计模式(Thread-Per-Message)
Thread-Per-Message设计模式每次请求访问,单独一个线程执行请求数据package com.ln.concurrent.chapter15;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent.chapter15 * @Name:Message * @Author:linianest * @CreateTime:2021/1/4 11:13 * @version:1.0 * @Descrip原创 2021-01-04 11:33:18 · 148 阅读 · 0 评论 -
多线程设计模式-Count Down设计模式
Count Down设计模式jdk自带的阻塞主线程模式,类似于join的功能:通过统计执行线程的个数,来判断执行线程是否执行完成,主线程阻塞package com.ln.concurrent.chapter14;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent.chapter14 * @Name:JDKCountDown * @Author:linianest * @CreateTime:2021/1/4原创 2021-01-04 11:09:09 · 90 阅读 · 0 评论 -
多线程设计模式-生产者消费者模式(Proudcer-consumer)
生产者消费者模式(Proudcer-consumer)多线程共享资源,生产者生产到消息队列中(大小限制),消费者从中消费消费数据,如果生产者过快,当满了队列后,生产者休眠,如果队列为空,消费者休眠消息体package com.ln.concurrent.chapter13;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent.chapter13 * @Name:Message * @Author:liniane原创 2021-01-03 18:21:39 · 195 阅读 · 2 评论 -
多线程设计模式-Servlet上下文模式(Threadlocal实现)
上下文模式(Threadlocal实现)在web中碰到运行上下文内容,可以用threadlocal的原理来实现,通过这种方式,更能明白网络请求中的上下文是如何实现的使用场景:网络请求的数据分别在DB和其他http中,通过threadlocal隔离其他线程的访问本线程的内容,达到多线程安全的目的上下文内容属性package com.ln.concurrent.chapter11;/** * @ProjectName: java-concurrency * @Package: com.ln.co原创 2021-01-03 16:54:33 · 404 阅读 · 2 评论 -
多线程设计模式-本地线程(Threadlocal)使用详解以及原理介绍
本地线程(Threadlocal)什么是ThreadLocal变量ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。存储模型是hashMap,key是每个线程的id,值原创 2021-01-03 16:13:22 · 1805 阅读 · 1 评论 -
多线程设计模式-高并发请求缓存模式(Guarded Suspension)
高并发请求缓存队列设计模式一,什么是Guarded Suspension模式如果执行现在的处理会造成问题,就让执行处理的线程等待。这种模式通过让线程等待来保证实例的安全性二,实现一个简单的线程间通信的例子一个线程(ClientThread)将请求(Request)的实例传递给另外一个线程(ServerThread)Request:线程实例RequestQueue:存放请求(Request)实例的队列ClientThread:把线程实例放到队列中ServerThread:从队列中取线程示例示原创 2021-01-03 15:49:51 · 176 阅读 · 0 评论 -
多线程设计模式-不可变对象设计模式
不可变对象设计模式无锁状态的设计,比有锁的设计模式减少加锁和释放锁的时间消耗不可变对象一定是线程安全的:里面的任何属性或者引用类型的属性都不能被修改可变对象不一定是线程不安全的:StringBufferFinal关键字1、final修饰的成员变量只能初始化一次赋值。1:直接赋值 2:构造函数中赋值final修饰的成员变量是基本类型,不可被修改,引用类型也如此,地址不可被修改,但是引用对象里面的数据是可以被修改的2、final修饰的类,是不可被继承的,成员方法都会被隐式指定为final类型方原创 2021-01-02 11:12:22 · 128 阅读 · 0 评论 -
Java设计模式-单例模式实际应用场景
单例模式应用的场景单例模式应用的场景一般发现在以下条件下: 资源共享的情况下,避免由于资源操作时导致的性能或损耗等,如日志文件,应用配置。确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。Windows的Task Manager(任务管理器)、Recycle Bin(回收站)、网站计数器单例模式应用的场景一般发现在以下条件下:1、资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。2、控制资源的情况原创 2021-01-02 10:19:41 · 3047 阅读 · 6 评论 -
多线程设计模式-多线程读写锁分离模式
多线程读写锁分离模式定义共享数据缓存区buffer,有线程往缓存区写数据,有线程从缓存区读取数据,读写锁分离读写锁:为了更高效的读写数据,将锁分为两种,读数据是读锁,可以并行化多线程执行,写数据是写锁,只能串行化。READWriteREADNYWriteYY读写锁ReadWriteLock/** * @ClassName:ReadWriteLock * @Author:linianest * @CreateTime:2020/3/24 11:06 *原创 2021-01-02 10:04:35 · 182 阅读 · 2 评论 -
多线程设计模式-单线程执行模式
3、单线程执行模式场景:有一个门,记录每次进入们的用户的姓名和来历package com.ln.concurrent.chapter5;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent.chapter5 * @version: 1.0 *//** * @ClassName:Gate * @Author:linianest * @CreateTime:2020/3/24 9:06 * @version原创 2021-01-02 08:57:49 · 186 阅读 · 1 评论 -
多线程设计模式-观察者模式
多线程观察者模式定义观察者事件公共接口package com.ln.concurrent.chapter4;/** * @ProjectName: java-concurrency * @Package: com.ln.concurrent.chapter4 * @Name:LifeCycleListener * @Author:linianest * @CreateTime:2021/1/1 17:30 * @version:1.0 * @Description TODO: 定义观察原创 2021-01-01 17:51:30 · 189 阅读 · 0 评论 -
设计模式-单例模式
1、单例模式饿汉式缺点:不能懒加载/** * @ClassName:SingletonObject1 * @Author:linianest * @CreateTime:2020/3/21 10:40 * @version:1.0 * @Description TODO: 单例设计模式:饿汉式 */public class SingletonObject1 { private static final SingletonObject1 instance = new Singlet原创 2020-12-31 18:16:45 · 85 阅读 · 0 评论 -
自定义缓存线程池
实现目标:实现类似缓存线程池的目标/** * @ClassName:SimpleThreadPool * @Author:linianest * @CreateTime:2020/3/20 18:02 * @version:1.0 * @Description TODO: 自定义线程池 *//** * 1、线程队列 * 2、拒绝策略:当达到阈值,就拒绝接受任务 * 3、丢弃 * 4、阻塞 */public class SimpleThreadPool extends Thre原创 2020-12-27 22:38:06 · 123 阅读 · 0 评论 -
lock与synchronized的区别
lock与synchronized的区别Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定。但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将 unLock()放到finally{} 中;synchronized在发生异常时,会自动释放线程占有的锁,因此原创 2020-12-27 22:03:45 · 107 阅读 · 0 评论 -
自定义显示锁lock
定义接口lock/** * @ClassName:Lock * @Author:linianest * @CreateTime:2020/3/18 9:35 * @version:1.0 * @Description TODO: 多线程自定义lock接口 */public interface Lock { // 超时异常 class TimeOutException extends Exception { public TimeOutException(St原创 2020-12-27 21:53:53 · 101 阅读 · 0 评论 -
volatile关键字的用法与含义
一旦一个共享变量被volatile修饰,具备了两层含义1、保证了不同进程间的可见性,即一个线程修改了该变量,那么该变量所在cpu线程缓存变量全部失效,读取缓存的数据只能去主线程去获取,这就是线程间的可见性2、禁止对其进行重排序,也就是保证了有序性3、并未保证原子性操作如以下代码,被volatile修饰的变量,一个线程一旦修改其值,其他线程都能看见/** * @ClassName:VolatileTest * @Author:linianest * @CreateTime:2020/3/22原创 2020-12-27 21:21:12 · 178 阅读 · 0 评论 -
多线程下的生产者和消费者
多个线程生产,多个消费者消费,实现生产一个消费一个/** * @ClassName:ProduceConsumerVersion3 * @Author:linianest * @CreateTime:2020/3/16 13:46 * @version:1.0 * @Description TODO: 多线程下,生产者消费者模型以及notifyAll()方法 */public class ProduceConsumerVersion3 { private int i = 0;原创 2020-12-27 18:07:47 · 59 阅读 · 0 评论 -
多线程采集多台主机信息任务,保持定量的线程运行
实现多线程采集机器信息的任务,假设有1000台机器需要采集信息入库,但是保持只有10个线程采集机器信息(条/台),当一个采集完成,才会加进去一个新的机器进去。/** * @ClassName:CaptureService * @Author:linianest * @CreateTime:2020/3/16 17:35 * @version:1.0 * @Description TODO: 多线程采集多台主机信息任务,保持定量的线程运行. */public class CaptureServ原创 2020-12-27 17:58:28 · 197 阅读 · 0 评论 -
Sleep与wait的区别
The difference of sleep and wait(sleep与wait的区别)1、sleep is the method of thread,but the wait is the method of object.(sleep是线程的方法,wait是对象的方法)2、sleep will not release hte object monitor(Lock),but he wait will be release the monitor and add to the Object原创 2020-12-27 16:56:17 · 127 阅读 · 0 评论 -
多线程中断的方式
通过三种方式中断线程的执行标志位中断捕捉中断型号,isInterrupted有对象的和类的方法暴力结束线程:通过将任务线程设置成守护线程的方式,如果调用的线程停止,守护线程也会停止线程中断:标志位停止线程/** * @ClassName:ThreadCloseGraceful * @Author:linianest * @CreateTime:2020/3/14 20:51 * @version:1.0 * @Description TODO: 通过标志位中断线程 */publi原创 2020-12-27 13:55:46 · 208 阅读 · 0 评论 -
Runnable接口详细详解
创建线程对象,默认有一个线程名,以Thread-开头,从0开始计数构造函数Thread()Thread-0Thread-1Thread-2其他构造方法Thread(Runnable target)如果在构造thread的时候没有传递Runnable或者没有复写Thread的run方法,该thread将不会调用任何的东西,如果传递了Runnable接口的实例,后者复写了Thread的run方法,则会执行该方法的逻辑单元(逻辑代码)public class CreateThread2..原创 2020-12-27 10:16:43 · 7550 阅读 · 0 评论