并发
LUK流
大数据/java web
展开
-
一次讨论volatile指令重排引发的经历
1. 学习volatile的时候的一个样例public class T { boolean runing = true;// int i=0; void m(){ System.out.println("m start"); while (runing){// try{// Time...原创 2019-12-04 14:08:37 · 386 阅读 · 0 评论 -
初次体验协程,对比线程有哪些优势(利用阿里库快速引入Quasar)
1. 什么是协程简单可以理解为理解为用户态线程,在学过操作系统的时候我们知道,线程可以在用户态和内核态之间切换,目前java中所实现的线程都会有自己的上下文,上下文在线程的运行过程中会不断的切换,线程就会不断地从用户态和内核态之间切换。由此带来巨大开销。协程:我们可以简单的理解为用户态线程,避免了内核态和用户态之间的切换来减少线程上下文切换的开销。但是JVM原生是不支持这样的操作的。因此如果...原创 2019-10-23 11:04:16 · 907 阅读 · 0 评论 -
面试真题(多线程交替打印ABC,中间变化打印顺序)
1.题目线程1只打印t1,线程2只打印t2,线程3只打印t3,控制他输出t1,t2,t3这样5遍,然后t2,t3,t1打印,最后t3,t1,t2之后一直循环。2.思路有关多线程的知识不明白的可以参考:https://blog.csdn.net/qq_35688140/article/category/9322916第一步:这个题第一眼有点类似于常见题“两个线程循环打印AB”,然后可以利用...原创 2019-09-12 11:27:49 · 704 阅读 · 0 评论 -
java并发(八):fork/jion机制
1.工作窃取算法每个线程有一个工作队列,线程1有一个工作队列1,线程2有一个工作队列2,当线程1将队列1中的任务执行完了以后就窃取队列2中的任务去执行。执行任务的队列从头到尾执行,窃取线程从尾部向头部执行任务。优点:充分了用线程的执行时间,且减少了资源抢占的情况。(每个线程的资源独立)缺点:会创建多个线程队列。而且当多个线程执行到最后只有一个任务的时候可能存在抢占资源的情况。2.代码...原创 2019-09-12 14:07:18 · 227 阅读 · 0 评论 -
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)
1.容量计算容量的阈值=容量*加载因子2.扩容容量扩容的容量大小会变成原来的两倍,用位移运算来加快计算的运行速率。3.单线程下的rehash1.初始化长度为2,加入11时开始扩容,数组长度变为原来的两倍2.依次加入2,9,11三个节点。4.多线程多线程操作rehash形成环。jdk1.8为了避免上述情况将头插法变幻成了尾插法。形成环以后,查找数据容易出现死循环。...原创 2019-09-12 15:52:11 · 7320 阅读 · 7 评论 -
java并发(十):高并发常用缓解技术
1.扩容例如存储资源mysql无法满足高并发要求。增加读性能:memcahe,redis,CDN缓存等。增加写性能:habse2.缓存(1)本地缓存:Guava CacheGuava Cache类似于cocurrentHashMap,每个节点存储的数据达到上限使用LRU置换算法。(2)分布式:memcache,redismemcache: 每次客户端请求数据,才有 ip一致性算法...原创 2019-09-12 18:04:21 · 400 阅读 · 0 评论 -
redis事务和redis分布式锁(悲观锁和乐观锁)
1.redis事务-mutil/execredis中mutil是事务的开始,exec是事务的结束127.0.0.1:6379> MULTIOK127.0.0.1:6379> set hello 1QUEUED127.0.0.1:6379> set hello 2QUEUED127.0.0.1:6379> set hello 3QUEUED127.0.0....原创 2019-09-18 15:22:07 · 2680 阅读 · 0 评论 -
ReentrantLock对AbstractQueuedSynchronizer的使用
1.ReentrantLock的骨架由ReentrantLock的目录结构可知,ReentrantLock有三个内部类,Sync,FairSync,NonfairSync。其中FairSync,NonfairSync继承了Sync,Sync继承了AbstractQueuedSynchronizer。FairSync和NonfairSync也就是我们常说的公平锁和非公平锁。公平锁和非公平锁的...原创 2019-09-19 17:25:33 · 249 阅读 · 0 评论 -
关于为什么ReentrantLock不是乐观锁的一些猜想
1.众所周知,ReentrantLock是一个悲观锁,但是查看源码,发现底层实现使用的是compareAndSet相关方法实现的,于是产生疑问:为什么ReentrantLock使用的和CAS一样的compareAndSet相关的方法实现的,CAS确实乐观锁,ReentrantLock却是悲观锁?猜想一:仔细看代码发现ReentrantLock使用了setExclusiveOwnerThread...原创 2019-09-23 20:47:23 · 9521 阅读 · 4 评论 -
关于秒杀场景的全面分析总结
1.技术层面1.高访问压力隔离将秒杀系统独立部署,甚至使用独立域名,使其与网站完全隔离。2.用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀.但是持续刷新商品页面详情页会对服务器造成压力重新设计秒杀商品页面,不使用网站原来的商品详细页面,页面内容静态化(静态在CDN或客户端),用户请求不需要经过应用服务。而是静态页面,秒杀按钮在秒杀开始前无法点击。3.突然增加的网络带宽:主要是...原创 2019-09-27 13:50:49 · 2441 阅读 · 0 评论 -
java并发(七):同步容器和集合类并发容器(J.U.C)
1. Collections.synchronizedList利用同步容器Collections.synchronizedList来将一个线程不安全的类转化成为一个线程安全的集合。线程同步容器都是通过sychronized方式实现的。@Slf4j@ThreadSafepublic class CollectionsExample1 { // 请求总数 public st...原创 2019-09-11 15:48:09 · 224 阅读 · 0 评论 -
java并发(六):四种引用类型和ThreadLocal
1. final关键字2. 线程封闭4. 四种引用类型参考了:https://www.zhihu.com/question/37401125强引用是使用最普遍的引用:Object o=new Object(); 特点:不会被GC将对象的引用显示地置为null:o=null; // 帮助垃圾收集器回收此对象。软引用用来描述一些还有用但是并非必须的对象,在Java中用java.lang...原创 2019-09-10 21:13:43 · 253 阅读 · 0 评论 -
java并发(五):安全的发布对象(多种单例模式的实现)
1. unsafePublish发布对象unsafePublish发布对象时,其他类可能会调用其中的共有getStatus方法来改变私有成员states的值。(不安全)@NotThreadSafe@Slf4jpublic class UnsafePublish { private String[] states = {"a","b","c"}; public Strin...原创 2019-09-10 21:02:00 · 147 阅读 · 0 评论 -
自旋锁和互斥锁
1.自旋锁:自旋锁会在抢不到cpu的时候一直去重试,如果我们可以保证在很短的时间就可以抢占到cpu的使用权,这种方式就可以便面我们sleep以后再启动带来的线程切换开销。while(getLock(lock).isfail){}自旋锁的使用:下面这一段就是Unsafe的getAndAddInt方法,while(!this.compareAndSwapInt(var1, var2, var5...原创 2019-09-03 20:40:45 · 103 阅读 · 0 评论 -
synchronized关键字:无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁
1.简介synchronized是一个jvm层次的关键字,可以同步某一段代码。与ReentrantLock不同,它不可被中断。synchronized的四个演变阶段: 无锁->偏向锁->轻量级锁->重量级锁下面是一些相关知识:MonitorMonitor可以理解为一个同步工具或一种同步机制,通常被描述为一个对象。每一个Java对象就有一把看不见的锁,称为内部锁或者Mo...原创 2019-09-03 21:09:11 · 2273 阅读 · 2 评论 -
公平锁和非公平锁,可重入锁和非可重入锁,独享锁和共享锁
1.公平锁先进入等待队列的线程先获得锁。2.非公平锁每次抢占锁的时候无论先后顺序,谁拿到就归谁所有。优点: 非公平锁是多个线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待。但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁,所以非公平锁有可能出现后申请锁的线程先获取锁的场景。非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高。缺点: 处于等待队列中的线程就算先到也...原创 2019-09-04 20:44:09 · 951 阅读 · 0 评论 -
四种常见线程池的使用
1.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。2.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。4.n...原创 2019-09-05 11:29:41 · 442 阅读 · 0 评论 -
java并发(一):缓存MESI协议,JMM
一、多级缓存现代CPU已经是多核处理器居多,加上主存的速度没有CPU快,很多时候,CPU需要等待主存。多级缓存的作用就是一个高速缓存区,来缓解这种速度上的差异。在程序执行中,主存中的数据可以放在高速缓存区中,让CPU去执行。但是高速缓存区空间较小,它的空间远远小于主存。缓存区就变成存放常用数据的存储区了。二、多级缓存一致性协议:MESI此处参考的资料:https://blog.csd...原创 2019-09-07 17:01:55 · 927 阅读 · 0 评论 -
java并发(二):CountDownLatch和Semaphore
1. CountDownLatch通过传入的num来给计数器赋初值,CountDownLatch countDownLatch = new CountDownLatch(num);通过下面的代码来减少计数器的数值countDownLatch.countDown();通过await方法等待计数器变为0countDownLatch.await();//等待计数器变为0CountDo...原创 2019-09-08 15:45:22 · 155 阅读 · 0 评论 -
java并发(三):atomic和LongAdder
1.AtomicInteger原子类改写上一节我们使用的代码(上一节:https://blog.csdn.net/qq_35688140/article/details/100629270)此时我们将上一节的int变成了AtomicInteger:@ThreadSafepublic class CountExample2 { // 请求总数 public static i...原创 2019-09-09 21:36:48 · 291 阅读 · 0 评论 -
synchronized作用范围(static修饰sychronized)
@Slf4jpublic class SychronizedExample1 { //test1方法和test2方法的作用是一样的 public void test1(int j){ synchronized (this){ for (int i = 0; i <10 ; i++) { log.info(...原创 2019-09-10 14:10:12 · 701 阅读 · 0 评论 -
java并发(四):volitale和happen-before原则
1.valatile保证可见性2.写屏障写屏障保证写完前后的数据都刷新到了主存,这样主存中去读取的数据都是最新的数据(不会存在脏数据)。3.读屏障读屏障保证读取之前的数据是最新的数据。4.valitale无法保证原子性修改数据分为3步:1.读取count2.count++3.回写count因为有可能线程1拿到count阻塞,线程2就算拿到最新的数据,但是线程1进行coun...原创 2019-09-10 17:17:05 · 228 阅读 · 0 评论 -
悲观锁和乐观锁
悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。乐观锁:认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。CAS就是我们常见的一...原创 2019-09-03 20:26:48 · 108 阅读 · 0 评论