随笔分类 -  Java并发编程

摘要:一、概述 我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 不过,随着后续Java版本更新对synchronized进行的各种优化后,synchronized并不会显得那么重了。比如在jdk1 阅读全文
posted @ 2019-09-09 16:52 leon66666 阅读(561) 评论(0) 推荐(0) 编辑
摘要:jdk 1.8版本 ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了。首先,取消了Segment分段锁的数据结构,取而代之的是数组+链表(红黑树)的结构。而对于锁的粒度,调整为对每个数组元素加锁(Node)。jkd 1.7版本的源码解读感兴趣的可以看这篇文章: 阅读全文
posted @ 2018-05-03 00:34 leon66666 阅读(551) 评论(0) 推荐(0) 编辑
摘要:Exchanger是双向的数据传输,2个线程在一个同步点,交换数据。先到的线程会等待第二个线程执行exchangeSynchronousQueue,是2个线程之间单向的数据传输,一个put,一个take。 先举个例子说明一下如何使用 再看一下内部结构 关键技术点1:CacheLine填充 交换数据的 阅读全文
posted @ 2018-03-14 17:03 leon66666 阅读(393) 评论(0) 推荐(0) 编辑
摘要:一、前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包 阅读全文
posted @ 2018-03-11 22:37 leon66666 阅读(400) 评论(0) 推荐(0) 编辑
摘要:当订单定时取消需要修改数据库订单状态,但是怎么确定订单什么时候应该改变状态,解决方案有下面两种: 第一种,写个定时器去每分钟扫描数据库,这样更新及时,但是如果数据库数据量大的话,会对数据库造成很大的压力。 第二种,创建订单的时候再订单表里面创建一条记录,然后把这条记录保存到DelayQueue队列里 阅读全文
posted @ 2018-03-08 16:42 leon66666 阅读(762) 评论(0) 推荐(0) 编辑
摘要:DelayQueue,带有延迟元素的线程安全队列,当非阻塞从队列中获取元素时,返回最早达到延迟时间的元素,或空(没有元素达到延迟时间)。DelayQueue的泛型参数需要实现Delayed接口,Delayed接口继承了Comparable接口,DelayQueue内部使用非线程安全的优先队列(Pri 阅读全文
posted @ 2018-03-08 16:20 leon66666 阅读(532) 评论(0) 推荐(1) 编辑
摘要:PriorityBlockingQueue是一个基于数组实现的线程安全的无界队列,原理和内部结构跟PriorityQueue基本一样,只是多了个线程安全。javadoc里面提到一句,1:理论上是无界的,所以添加元素可能导致outofmemoryerror;2.不容许添加null;3.添加的元素使用构 阅读全文
posted @ 2018-03-07 15:16 leon66666 阅读(467) 评论(0) 推荐(0) 编辑
摘要:SynchronousQueue是一种特殊的阻塞队列,不同于LinkedBlockingQueue、ArrayBlockingQueue和PriorityBlockingQueue,其内部没有任何容量,任何的入队操作都需要等待其他线程的出队操作,反之亦然。如果将SynchronousQueue用于生 阅读全文
posted @ 2018-03-06 16:08 leon66666 阅读(485) 评论(0) 推荐(0) 编辑
摘要:一、前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁ReadLock和写锁WriteLock,可以通过这两种锁实现线程间的同步,下面开始进行分析。 二、 阅读全文
posted @ 2018-02-06 16:24 leon66666 阅读(497) 评论(0) 推荐(0) 编辑
摘要:原文已经写得非常详细了,直接把大神的文章转发过来了 https://www.cnblogs.com/xrq730/p/4979021.html 前言 这篇文章被归到Java基础分类中,其实真的一点都不基础。网上写ReentrantLock的使用、ReentrantLock和synchronized的 阅读全文
posted @ 2018-02-02 16:15 leon66666 阅读(407) 评论(0) 推荐(1) 编辑
摘要:线程的状态:New、Runnable、Blocked、Waiting、Timed waiting、Terminated 1. RUNNABLE,对应"就绪"和"运行"两种状态,也就是说处于就绪和运行状态的线程在java.lang.Thread中都表现为"RUNNABLE"2. BLOCKED,对应" 阅读全文
posted @ 2018-02-01 11:36 leon66666 阅读(384) 评论(0) 推荐(0) 编辑
摘要:http://www.infoq.com/cn/articles/fork-join-introduction http://www.importnew.com/14506.html Java7中的ForkJoin并发框架初探(下)—— ForkJoin的应用 http://www.molotang 阅读全文
posted @ 2017-08-01 14:14 leon66666 阅读(193) 评论(0) 推荐(0) 编辑
摘要:转自:http://www.cnblogs.com/Mainz/p/3546347.html?utm_source=tuicool&utm_medium=referral 锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释 阅读全文
posted @ 2017-08-01 14:13 leon66666 阅读(591) 评论(0) 推荐(0) 编辑
摘要:volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于v 阅读全文
posted @ 2017-08-01 14:11 leon66666 阅读(439) 评论(0) 推荐(0) 编辑
摘要:一、volatile的作用 在《Java并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操作,对系统的性能有 阅读全文
posted @ 2017-06-09 15:55 leon66666 阅读(514) 评论(0) 推荐(0) 编辑
摘要:大致意思:Tim Cull碰到一个SimpleDateFormat带来的严重的性能问题,该问题主要有SimpleDateFormat引发,创建一个 SimpleDateFormat实例的开销比较昂贵,解析字符串时间时频繁创建生命周期短暂的实例导致性能低下。即使将 SimpleDateFormat定义 阅读全文
posted @ 2017-03-22 00:09 leon66666 阅读(2438) 评论(0) 推荐(0) 编辑
摘要:转自:http://www.importnew.com/15842.html Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也 阅读全文
posted @ 2017-03-20 14:07 leon66666 阅读(324) 评论(0) 推荐(0) 编辑
摘要:持续更新中... 共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,直到已释放所有共享锁。获准共享锁的事务只能读数据,不能修改数据。 排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的锁,直到在事务的末尾将资源上的锁释放为止。 阅读全文
posted @ 2017-03-04 10:25 leon66666 阅读(798) 评论(0) 推荐(0) 编辑
摘要:1. 为什么使用线程池 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP 或 POP)、通过 JMS 队列或者可能通过轮询数据库。不管请求如何到达 阅读全文
posted @ 2017-02-28 12:22 leon66666 阅读(473) 评论(0) 推荐(0) 编辑
摘要:集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的 阅读全文
posted @ 2017-02-27 00:54 leon66666 阅读(671) 评论(0) 推荐(0) 编辑