多线程
深入了解多线程
码农回忆录
这个作者很懒,什么都没留下…
展开
-
Java实现自定义自旋锁
自旋锁1.空轮询实现此处主要利用while空轮询以及原子包的CASpackage com.gy.spinlock;import java.util.concurrent.atomic.AtomicInteger;/** * 利用空轮询实现 */public class SpinLock01 { private AtomicInteger state = new AtomicInteger(0); public void lock() { whil原创 2020-06-01 21:33:36 · 5122 阅读 · 1 评论 -
【多线程】队列模式
1. 实现自定义阻塞队列阻塞队列在get元素时如果队列为空那么直接阻塞当前线程,在添加元素时notifyAll所有线程public class RequestQueue { private final LinkedList<Request> queue = new LinkedList<>(); public Request getReques...原创 2020-04-02 13:24:22 · 3881 阅读 · 0 评论 -
【多线程】JAVA实现读写锁
1. 优势读写分离锁可以提升程序的并发读,因为在大多数情况下都是读请求那么此时读与读之间是可以并行执行的不会产生数据不一致问题,只有读写,写写操作才是互斥的2. 读写锁实现package com.gy.readwritelock;public class ReadWriteLock { private int readingReaders; private int ...原创 2020-04-02 12:59:23 · 4246 阅读 · 1 评论 -
【多线程】获取多线程执行结果
1. 观察者模式结合多线程实现获取线程执行结果在多线程开发中,我们没办法获取线程执行完成后的结果,但是当我们利用观察者模式的时候我们就可以获取到多线程的执行结果2.具体实现假设目前有一批id需要查询并需要获得查询结果, 利用多线程结合设计模式实现2.1 LifeCycleListenerpublic interface LifeCycleListener { void o...原创 2020-04-02 12:52:12 · 4596 阅读 · 0 评论 -
多线程——12队列模式
目标实现一个队列来存储任务, 然后启动一个生产者向队列添加任务, 启动服务者消费队列里面的任务主要角色任务是什么: 这里客户端的请求所以使用request任务的队列:requestQueue在这里面get如果对列为空让get的线程wait, 同理put就直接notifyAll谁来处理任务:ServerThread谁来发起请求:ClientThread代码实现Request...原创 2020-02-22 11:36:35 · 2096 阅读 · 0 评论 -
多线程——11Future模式
Future产生起源在以前我们写的多线程执行任务是拿不到多线程的执行结果的,除非我们使用前面咱们说的观察者模式来获取; 在这里我们提供能外一种方式来获取线程的执行结果三个重要角色Future他是保存任务调用之后的结果,在他里面需要提供get方法让主线程去拿到结果, 也要提供设置方法让直行线程去设置结果; 如果执行未完成就调用泛型返回值的wait方法阻塞主线程,当执行线程调用了设置方法时...原创 2020-02-22 11:24:45 · 2258 阅读 · 0 评论 -
多线程——10读写分离锁
为什么需要读写分离锁读 和 读的操作是不需要加锁的, 只有存在写操作才需要加锁对共享变量的读 读操作不用锁读和写不可同时发生写和写也不可同时发生实际上当读操作比较多时,此时的性能会更高代码实现public class ReadWriteLock { private int readingReaders; private int waitingReaders; ...原创 2020-02-22 10:11:31 · 2156 阅读 · 0 评论 -
多线程——9多线程实现观察者模式任务
目标实现对一批id进行多线程的并行处理, 处理完成之后需要得到处理结果如: [1,2,5,8,11,22,44], 这一批id被三个线程执行更新操作, 执行完成之后需要得到执行的结果实现定义观察者接口此方法是当任务执行完成时回调的方法public interface LifeCycleListener { void onEvent(ObserverableRunnabl...原创 2020-02-22 09:57:50 · 2758 阅读 · 0 评论 -
多线程——8volatile关键字
volatile关键字多线程开发中主要关注因素原子性java中对基本数据类型的读取和赋值操作都是保证原子性的I = 10; => cache 10; memory 10 原子操作b=a; 1.read a 2. assign b = > 非原子操作可见性使用volatile保证可见性和有序性, 但不保证原子性有序性Happens-befor原则就是保证有序性的...原创 2020-02-22 09:32:27 · 2087 阅读 · 0 评论 -
多线程——7单列模式中的多线程问题
##单列模式中的多线程问题1) 饿汉式代码:问题: 饿汉式主要问题在于不适用该单列其实列也被创建了,这样会浪费内存资源2)懒汉式代码:问题:因为if判断这里引入了多线程问题,此时单列可能会出现多列3)懒汉式–同步代码:问题: 虽然在方法上面加了同步代码块解决了线程安全问题,但这样在多线程情况下存在性能问题4)双重检测机制代码:问题: 此处虽然解决...原创 2020-02-21 10:28:00 · 2280 阅读 · 0 评论 -
多线程——6自定义线程池
自定义线程池线程池主要关注点首先需要线程池里面的线程不能停止还需要一个任务队列(任务队列可以让空闲线程处于wait状态)线程初始化大小每个线程run起来之后都必须去看任务里面有没有任务没有任务就wait, 有任务就在同步代码块中取出任务,然后在同步代码块外执行任务具体实现public class SimpleThreadPool { private final int s...原创 2020-02-21 10:09:47 · 3341 阅读 · 0 评论 -
多线程——5自定义显示锁
自定义显示锁自定义显示锁思路显示锁的实现主要使用了wait和notifyAll方法, 我们定义一个Boolean变量作为标志,同步lock方法里面首先判断当前锁是否被使用,如果被使用了自己加入一个等待队列(自定义一个集合)然后让自己wait, 如果没有被使用那么先把自己从等待队列移除, 可以直接把锁获取到设置bool值为true。解锁方法:直接设置锁bool值为false然后notifyA...原创 2020-02-21 09:49:49 · 2294 阅读 · 0 评论 -
多线程——4线程间的通信
多线程——4线程间的通信一、内容安排wait和notify方法简单的生产者消费者面试点二、文章内容1. wait和notify方法 当一个对象调用了wait方法那么它将阻塞当前线程, 直到有另外一个线程调用了当前对象的notify方法,被阻塞的线程才可能被唤醒。 注意: 若要调用这两个方法必须先获得对象的锁,不让会抛出异常案列: 启动A、B两个线程,A线程中调用wai...原创 2019-11-25 22:35:35 · 2154 阅读 · 0 评论 -
多线程——3线程安全问题及分析
多线程安全问题&线程通信一、内容安排实现两个线程累加一个变量到10_000累加超过10_000的原因分析synchronized解决安全问题synchronized可以加在那些地方synchronized面试考点后续更新二、文章内容1. 实现两个线程累加一个变量到10_000实现步骤定义静态变量NUM等于0, MAX等于10_000定义任务Runable,...原创 2019-11-04 21:39:04 · 2156 阅读 · 0 评论 -
多线程——2如何正确的中断线程
多线程探险——2常用方法一、内容安排什么是守护线程(Daemon Thread)Join方法的含义自己join自己会是什么效果Interrupt方法综合案列:如何去停止线程二、文章内容1. 什么是守护线程(Daemon Thread)守护线程:从字面意思我们可以感觉到好像是要守护某个事物一样, 实际上简单理解守护线程就是另外一个线程的兄弟(真的做到了不...原创 2019-11-02 10:29:12 · 3618 阅读 · 0 评论 -
多线程——1线程基础
Java多线程基础一、文章内容1.多线程基本介绍2.多线程hello world3.创建线程的方式4.Runnable介绍5.面试点注意:如果觉得以上内容简单可跳过本文内容,本文主要针对没怎么了解过多线程的读者二、正式开始1. 多线程基本介绍 废话不多说,既然大家看到了这篇文章证明大家已经对多线程有了基础的了解; 一句话多线程就是原本由一个人干的活现在找了多个人来同时做(如...原创 2019-11-02 00:33:14 · 2174 阅读 · 0 评论