![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 89
qq_36014627
这个作者很懒,什么都没留下…
展开
-
每天一例多线程[day5]-----synchronized锁重入
package com.jeff.base.sync005; /** * synchronized的重入: * 当一个线程得到一个对象锁且还未释放锁时,再次请求此对象锁时可以再次得到该对象的锁 * @author jeff * */ public class SyncDubbo1 { public sy...转载 2018-09-24 23:22:02 · 87 阅读 · 0 评论 -
每天一例多线程[day21]-----ReentrantReadWriteLock
ReentrantReadWriteLock,读写锁,核心就是实现读写分离的锁,在高并发访问下,尤其是读多写少的场景下,性能要远远高于重入锁。之前的ReentrantLock和Synchronized在同一时间内只能有一个线程访问被锁定的代码,那么读写锁则不同,其本质时分成两个锁,读锁+写锁,在读锁下,多个线程可以并发地访问;但是在写锁的时候只能一个一个顺序访问。总结:读读共享,读写互斥,写写...转载 2018-10-01 14:39:44 · 96 阅读 · 0 评论 -
每天一例多线程[day21]-----ReentrantReadWriteLock
ReentrantReadWriteLock,读写锁,核心就是实现读写分离的锁,在高并发访问下,尤其是读多写少的场景下,性能要远远高于重入锁。之前的ReentrantLock和Synchronized在同一时间内只能有一个线程访问被锁定的代码,那么读写锁则不同,其本质时分成两个锁,读锁+写锁,在读锁下,多个线程可以并发地访问;但是在写锁的时候只能一个一个顺序访问。总结:读读共享,读写互斥...转载 2018-10-01 14:51:19 · 95 阅读 · 0 评论 -
每天一例多线程[day9]-----多线程间的通信
volatile实现 package com.jeff.base.conn008; import java.util.ArrayList; import java.util.List; /** * 定义t1和t2两个线程: * t1线程往list中加入元素 * t2线程发现list元素个数为5时抛出异常,停止t2线程...转载 2018-09-26 23:08:09 · 92 阅读 · 0 评论 -
每天一例多线程[day10]-----使用wait和notify模拟实现阻塞队列
package com.jeff.base.conn009; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * 使用wait和not...转载 2018-09-26 23:17:16 · 100 阅读 · 0 评论 -
每天一例多线程[day11]-----ThreadLocal
每天一例多线程[day11]-----ThreadLocal package com.jeff.base.conn010; public class ConnThreadLocal { public static ThreadLocal<String> th = new ThreadLocal<String>(); ...转载 2018-09-30 11:22:10 · 92 阅读 · 0 评论 -
每天一例多线程[day12]-----单例模式与线程安全
package com.jeff.base.conn011; public class DubbleSingleton { private static DubbleSingleton ds; public static DubbleSingleton getDs(){ if(ds == null){ try { //...转载 2018-09-30 13:48:11 · 90 阅读 · 0 评论 -
每天一例多线程[day13]-----同步类容器和并发类容器
对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException如: package com.jeff.base.coll012; import java.util.Iterator; import java.util.Vector; /** ...转载 2018-09-30 14:28:48 · 111 阅读 · 0 评论 -
每天一例多线程[day14]----Queue队列
关于什么时候使用MQ消息队列,什么时候使用JAVA自带队列,有一些基本的原则,如下图:生产者:生产消息的速度很慢,缓慢地放入MQ中存储。消费者:消费能力强,快速处理掉MQ中的消息。这种场景下,MQ就不适合使用了,因为消费端的处理能力很强,生产者完全可以通过TCP长连接直连消费者,比如使用Netty或者Mina等框架就比较合适。介绍集中JDK并发包下的队列:Concurr...转载 2018-09-30 15:23:20 · 147 阅读 · 0 评论 -
每天一例多线程[day22]-----Disruptor并发框架简介HelloWorld
Disruptor是一个开源的并发框架,并获得2011年Duke's程序框架创新奖,能够在无锁的情况下实现网络的Queue队列并发操作。Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式的实现,或者事件监听模式的实现。也可以理解为一个高效的“生产者-消费者”模型。性能远远高于传统的BlockingQueue。 Disrup...转载 2018-10-15 22:27:17 · 162 阅读 · 0 评论 -
每天一例多线程[day20]-----ReentrantLock
ReentrantLock是JDK的并发包下locks包下的工具类,ReentrantLock比synchonized性能要好,但是jdk1.8之后synchonized的性能也得到大幅度提升,不亚于ReentrantLock。锁的演变 ReentrantLock是由synchonized和对象锁演变而来。回忆以下之前使用synchronized和Object锁的方式: ...转载 2018-10-01 14:37:11 · 82 阅读 · 0 评论 -
每天一例多线程[day19]-----JDK实现Future的用法
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util....转载 2018-10-01 09:27:35 · 101 阅读 · 0 评论 -
每天一例多线程[day6]-----synchronized细节
syhchronized写法举例 package com.jeff.base.sync006; /** * 使用synchronized声明的方法在某些情况下是有弊端的, * 比如:A线程调用同步的方法执行一个很长时间的任务,那么B线程就必须等待比较长的事件才能执行, * 这样的情况下可以使用synchronized去优化代码的执行时间...转载 2018-09-24 23:43:11 · 84 阅读 · 0 评论 -
每天一例多线程[day7]-----volatile关键词的含义
先出一道题:package com.day20180208; public class MyThread extends Thread { private int count = 1; private void setCount(int count) { this.coun...转载 2018-09-24 23:46:53 · 95 阅读 · 0 评论 -
每天一例多线程[day8]-----AutomicInteger原子操作
即使我们使用volitile,也无法保证多线程访问共享变量的原子性,如下: [java] view plain copy<code class="language-java">package com.jeff.base.sync007; /** * * volatile关键字不具备synchronized关键字的原子性(同步) * @au...转载 2018-09-24 23:50:38 · 343 阅读 · 0 评论 -
每天一例多线程[day1]-----synchronized与锁竞争
[javascript] view plain copy<code class="language-java">/** * 多个线程一把锁 * * 线程安全概念: * <span> </span> 当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为, * 那么这个类(对象或方法)就是线程安全的。...转载 2018-09-19 22:42:31 · 102 阅读 · 0 评论 -
每天一例多线程[day2]-----synchronized与多个线程多个锁
package com.jeff.base.sync002; /** * 多个线程多个锁 * * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁, * 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock), * * @author je...转载 2018-09-19 22:58:08 · 204 阅读 · 0 评论 -
每天一例多线程[day3]-----synchronized与一个对象多个方法一把锁
package com.jeff.base.sync003; /** * 一个对象多个方法一把锁 * * 对象锁的同步和异步问题 * @author jeff * */ public class MyObject { /** * 同步方法 */ pu...原创 2018-09-19 23:09:07 · 208 阅读 · 0 评论 -
每天一例多线程[day4]-----synchronized与DirtyRead脏读问题
问题:以oracle数据库为例,比如当我们在下午2点钟查询用户表的一条记录值100,由于网络卡顿,数据库直到2点办才查询出来这条记录,在这半小时内,其他用户将用户表的这条记录修改为200了,那么请问2点半我们看到的这条数据是100还是200?答案是100,原因是oracle数据库存在一致性读的特性,不管修改的次数再多,即使抛出异常也不会看到200这个数据。 在多线程应用中,当我们在设置...转载 2018-09-19 23:14:26 · 123 阅读 · 0 评论 -
每天一例多线程[day17]-----Executors框架
/** * 以下四种底层实现核心都是实例化了一个ThreadPoolExecutor对象返回,其实就是根据以下四种传递的具体参数 * 不同而实现的四种不同的功能。 * * ThreadPoolExecutor来实现以下四种的原因是,当以下四种不满足我们需求时,我们可以 * 自定义线程池。 * 构造参数: * publ...转载 2018-10-01 08:51:52 · 90 阅读 · 0 评论 -
每天一例多线程[day18]-----ThreadPoolExecutor
/* 自定义线程池。 * 构造参数: * public ThreadPoolExecutor( * int corePoolSize,--当前线程池核心线程数 * int maximumPoolSize,--当前线程池最大线程数 * long keepAliveTime,--保持活着的空间时间 * TimeUnit unit,-...转载 2018-10-01 09:12:58 · 92 阅读 · 0 评论 -
每天一例多线程[day15]----Future模式之美丽的谎言
Future模式的适用场景是:想要得到数据时,先返回数据的包装,异步获取真实数据,真正需要时再拿数据,真实数据也许已经异步得到,也许还在阻塞获取中... 这有点像BOSS布置任务,比如由于市场需要,将在本月20号发布一个版本,今天是10号,分配任务给小弟去做了,询问小弟能不能搞定,由于小弟着急上位就答应了。而BOSS忙着处理每天的商务问题,在20号之前都没有空理会给小弟分配的任务。...转载 2018-09-30 16:40:36 · 86 阅读 · 0 评论