摘要: Java并发集合 并发集合实现1 JDK1.5的出现,对于集合并发编程来说,java developer有了更多的选择。不过,在JDK1.5之前,Java也还是提供了一些解决方案。 (1)最为简单直接的就是在程序中我们自己对共享变量进行加锁。不过,缺点也显而易见,手动实现线程安全间接增加了程序的复杂 阅读全文
posted @ 2018-10-31 22:51 青春暮年 阅读(587) 评论(0) 推荐(0) 编辑
摘要: HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为11,扩容:newsize = olesize*2+1 计算index的方法: 阅读全文
posted @ 2018-10-31 22:36 青春暮年 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 本文转自:https://www.cnblogs.com/dolphin0520/p/3932905.html JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价 阅读全文
posted @ 2018-10-31 22:13 青春暮年 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 多个线程不管以何种方式访问某个类,并且在主调代码中不需要进行同步,都能表现正确的行为。 线程安全有以下几种实现方式: 不可变 不可变(Immutable)的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。只要一个不可变的对象被正确地构建出来,永远也不会看到它在多个线程之中处于不一致的状态。 阅读全文
posted @ 2018-10-31 16:57 青春暮年 阅读(457) 评论(0) 推荐(0) 编辑
摘要: Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 主内存与工作内存 处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。 加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共 阅读全文
posted @ 2018-10-31 16:28 青春暮年 阅读(168) 评论(0) 推荐(0) 编辑
摘要: java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.U.C 的核心。 CountdownLatch 用来控制一个线程等待多个线程。 维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 awa 阅读全文
posted @ 2018-10-31 11:37 青春暮年 阅读(822) 评论(0) 推荐(0) 编辑
摘要: 当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调。 join() 在线程中调用另一个线程的 join() 方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。 对于以下代码,虽然 b 线程先启动,但是因为在 b 线程中调用了 a 线程的 joi 阅读全文
posted @ 2018-10-31 11:22 青春暮年 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能。 首先来看看为什么会出现这个关键字。 内存可见性 由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。 线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数 阅读全文
posted @ 2018-10-31 10:45 青春暮年 阅读(238) 评论(0) 推荐(0) 编辑
摘要: Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock。 synchronized 1. 同步一个代码块 public void func() { synchronized (this) 阅读全文
posted @ 2018-10-31 10:14 青春暮年 阅读(162) 评论(0) 推荐(0) 编辑