
Java - JUC
文章平均质量分 96
# Java - JUC
yamaxifeng_132
努力、奋斗
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
伪共享(false sharing),并发编程无声的性能杀手
伪共享(false sharing),并发编程无声的性能杀手在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素。前段时间学习了一个牛X的高性能异步处理框架 Disruptor,它被誉为“最快的消息框架”,其 LMAX 架构能够在一个线程里每秒处理 6百万 订单!在讲到 Disruptor 为什么这么快时,接触到了一个概念——伪共享( false sharing ),其中提到:缓存行上的写竞争是运行在 SMP 系统中并行转载 2021-03-08 22:12:49 · 257 阅读 · 0 评论 -
三个线程循环打印ABC10次的几种解决方法
题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕打印10次ABC整体思路:该问题为三个线程的同步唤醒机制即ThreadA->ThreadB->ThreadC->ThreadA循环执行三个线程。public class MyThreadPrinter2 implements Runnable { private String name; p...转载 2020-04-03 22:12:56 · 1992 阅读 · 1 评论 -
ThreadLocal可能引起的内存泄露
threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收。而这块value永远不会被访问到了,所以存在着内存泄露,最好的做法是将调用threadlocal的remove方法.在threadlocal的生命周期中,都存在这些引用。看下图:实线代表强引用,虚线代表弱引用。 每个thread中都存在一个map,map...转载 2016-12-12 11:20:59 · 352 阅读 · 0 评论 -
Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。Jav...转载 2019-01-28 10:53:14 · 219 阅读 · 0 评论 -
ExecutorService中shutdown()、shutdownNow()、awaitTermination()的使用及区别
使用ExecutorService类时,经常用到shutdown()、shutdownNow()、awaitTermination()方法, 它们怎么使用,有什么区别呢? 下面我们来说说。一、方法说明1、shutdown():将线程池状态置为 shutdown ,并不会立即停止英文原意:关闭,倒闭;停工。 这里的意思是 关闭线程池。与使用数据库连接池一样,每次使用完毕后,都要关闭线程...转载 2019-01-26 21:28:06 · 901 阅读 · 0 评论 -
Sleep(0)的妙用
博文转自:https://blog.youkuaiyun.com/qiaoquan3/article/details/56281092Thread.Sleep(0) 表示挂起0毫秒,你可能觉得没作用,你要写Thread.Sleep(1000) 就有感觉了。似乎毫无意义。MSDN的说明:指定零 (0) 以指示应挂起此线程以使其他等待线程能够执行。Thread.Sleep(0) 并非是真的要线程挂起0毫秒...转载 2019-01-23 20:21:53 · 163 阅读 · 0 评论 -
JVM内存模型、指令重排、内存屏障概念解析
在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器、运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要。否则,你很难搞清楚哪些操作是在并发先绝对安全的?哪些是相对安全的?哪些并发同步手段性能最低?valotile的二层语义分别是什么?等等。 本来打算自己写一篇有关JVM内存模型的博文,后来整理资料的时候偶然发...转载 2019-01-07 23:31:13 · 265 阅读 · 0 评论 -
线程池的参数解析及简单创建
1. corePoolSize: 核心线程数,能够同时执行的任务数量2. maximumPoolSize:除去缓冲队列中等待的任务,最大能容纳的任务 数(其实是包括了核心线程池数量)3. keepAliveTime:超出workQueue的等待任务的存活时间,就是指maximumPoolSize里面的等待任务的存活时间4. unit:时间单位5. workQueue: 阻塞等待线...原创 2018-12-27 21:17:51 · 326 阅读 · 0 评论 -
BlockingQueue简介
基本原理特殊的队列:BlockingQueue如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.使用BlockingQueue的关键技术点如下...原创 2018-12-26 23:11:36 · 393 阅读 · 0 评论 -
ThreadLocal工作原理
在这篇文章中,总结了一下面试过程中遇到的关于ThreadLocal的内容。总体上说,这样回答,面试算是过得去了。但是,这样的回答,明显仅仅是背会了答案,而没有去研究ThreadLocal的最根本的实现原理。一共有两个问题。1、每个线程的变量副本是存储在哪里的?2、变量副本是怎么从共享的那个变量赋值出来的?源码中的threadlocal的初始值是什么时机设置的?最关键的问题是:...转载 2017-03-12 00:16:21 · 329 阅读 · 0 评论 -
Java线程池的介绍以及工作原理
在什么情况下使用线程池?1.单个任务处理的时间比较短 2.将需处理的任务的数量大使用线程池的好处:1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2. 提高响应速度: 当任务到达时,任务可以不需要等到线程创建就能立即执行。3. 提高线程的可管理性: 线程是稀缺资源,如果无限制的创建。不仅仅会降低系统的稳定性,使用线程池...转载 2018-12-20 23:44:53 · 170 阅读 · 0 评论 -
乐观锁和悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不...原创 2017-01-10 23:04:24 · 205 阅读 · 0 评论 -
Java内存屏障和可见性
引言在多线程编程中,有的时候会看见如下的代码public class task{ private boolean success; public void getResult(){ while(success==false){ doSomethind(); } } public void success(){原创 2016-12-12 11:21:47 · 713 阅读 · 0 评论 -
Java 理论与实践: 正确使用 Volatile 变量
Java™ 语言包含两种内在的同步机制:同步块(或方法)和volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。转载 2016-09-15 16:28:07 · 342 阅读 · 0 评论 -
Java并发包
java.util.concurreny转载 2016-11-29 12:26:53 · 370 阅读 · 0 评论