
多线程
文章平均质量分 74
chenfangya_93
这个作者很懒,什么都没留下…
展开
-
异步转同步操作 使用 CountDownLatch
进行异步转同步操作,使用CountDownLatch时,每个线程退出前必须调用 countDown方法。注意:1、线程执行代码注意要 catch 异常,确保 countDown 方法被执行到,避免主线程无法执行至 await 方法,直到超时才返回结果。2、子线程抛出异常堆栈,不能在主线程 try - catch 到例:public class Test { private st...原创 2018-09-26 17:30:29 · 2937 阅读 · 0 评论 -
i++ 或者 ++i 是线程安全的吗。
不论是++i还是i++都不是原子操作,在运行中都可能会有CPU调度产生,造成i的值被修改,造成脏读脏写。volatile不能解决这个线程安全问题。因为volatile只能保证可见性,不能保证原子性。可以用锁。使用synchronized或者ReentrantLock都可以解决这个问题,一般使用synchronized更好,因为JVM团队一直以来都在优先改进这个机制,可以尽早获得更好...原创 2018-10-08 14:13:32 · 1535 阅读 · 3 评论 -
Java 多线程三大核心
原子性Java 的原子性就和数据库事务的原子性差不多,一个操作中要么全部执行成功或者失败。JMM 只是保证了基本的原子性,但类似于 i++ 之类的操作,看似是原子操作,其实里面涉及到:获取 i 的值。自增。再赋值给 i。这三步操作,所以想要实现 i++ 这样的原子操作就需要用到 synchronized 或者是 lock 进行加锁处理。如果是基础类的自增操作可以使用 Atomic...原创 2018-10-09 09:31:17 · 155 阅读 · 0 评论 -
ConcurrentHashMap 实现原理
由于 HashMap 是一个线程不安全的容器,主要体现在容量大于总量*负载因子发生扩容时会出现环形链表从而导致死循环。因此需要支持线程安全的并发容器 ConcurrentHashMap 。JDK1.7 实现数据结构 如图所示,是由 Segment 数组、HashEntry 数组组成,和 HashMap 一样,仍然是数组加链表组成。ConcurrentHashMap 采用了分段锁技术,其...原创 2018-10-09 11:26:55 · 510 阅读 · 0 评论 -
volatile 关键字
内存可见性由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。这里所提到的主内存可以简单认为是堆内存,而工作内存则可以认为是栈内存。如下图所...原创 2018-10-09 14:11:21 · 146 阅读 · 0 评论 -
CompletableFuture: 组合式异步编程
Future 接口Java 8之前使用Future的例子: @Test public void test1() { ExecutorService executor = Executors.newCachedThreadPool(); Future<Double> future = executor.submit(new Callable<Double>() ...原创 2018-11-02 17:22:28 · 455 阅读 · 0 评论 -
多线程基础
格式混乱。。。。可至我的有道云查看:http://note.youdao.com/noteshare?id=277d8d512f6f80f111bc7a058aa3cb27&sub=743EACECE382418AAEEE56CA086E5CD1同步(Synchronous)和异步(Asynchronous)同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调...原创 2018-12-07 15:54:19 · 213 阅读 · 0 评论