Java高并发
plugcy
精通数据库
展开
-
详解乐观锁的一种实现方式——CAS
线程安全众所周知,Java是多线程的。但是,Java对多线程的支持其实是一把双刃剑。一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程安全问题。线程安全性可能是非常复杂的,在没有充足的同步的情况下,多个线程中的操作执行顺序是不可预测的。Java里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性。加上复合操作的原子性,我们可以认为Java的线程安全...原创 2018-04-12 21:31:03 · 20742 阅读 · 1 评论 -
实现线程的顺序执行
之前,看到过一个题目,是关于如何使得线程顺序执行的当时,我的第一个想法就是使用join方法,在t3线程内部调用t2线程的join()方法,然后在t2内部继续调用t1线程的join方法来实现线程的顺序执行,话不多说,手写代码来测试结果:/*实现三个线程的顺序执行 * coded by Jerome */public class ThreadRun { public static void ...原创 2018-06-16 21:10:23 · 676 阅读 · 1 评论 -
JDK并发容器和BlockingQueue
JDK的并发容器Map类HashMap,位于java.util包下,是不安全的,可以采用Collections工具类来进行包装public static Map m = Collections.synchronizedMap(new HashMap());这样得到的Map就是线程安全的,但是在多线程环境下性能表现不是很好,因为它是通过加锁的方式,会导致其他线程对Map的操作全部等待Concurr...原创 2018-06-01 21:21:48 · 437 阅读 · 0 评论 -
线程池ThreadPoolExecutor参数介绍
ThreadPoolExecutor参数介绍重点说明任务队列和拒绝策略两个参数任务队列workQueue任务队列是代表已提交但还没执行的任务,是一个BlockingQueue接口的对象,可以使用以下几种BlockingQueue直接提交队列:SynchronousQueue,没有容量,所以提交的任务不能保存,总是将任务交给空闲线程,如果没有空闲线程,如果没有空闲线程,就创建线程,一旦达到maxim...原创 2018-05-31 21:55:18 · 528 阅读 · 0 评论 -
生产者-消费者模式
生产者-消费者模式生产者-消费者模式是一种经典的多线程设计模式,它为多线程之间的协作提供了良好的解决方案。利用共享内存缓冲区来进行通信。它有以下两个好处:生产者和消费者之间不直接进行通讯,而是通过共享内存缓冲区,从而将生产者和消费者进行了解耦由于共享内存缓冲区的存在,允许生产者和消费者在执行速度上存在时间差异,平衡了生产者和消费者的处理能力实现方式在Java中一共有四种方法支持同步,其中前三个是同...原创 2018-06-07 20:52:06 · 166 阅读 · 0 评论 -
ConcurrentLinkedQueue详解
一、 前言常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentLinkedQueue是如何使用CAS实现的。ConcurrentLinkedQueue是无界队列。对于使用锁实现阻塞队列的也分两种情况,一种是使用一把锁,例如ArrayBlockingQueue;还有一种是LinkedBlocki...原创 2018-06-13 23:49:09 · 1359 阅读 · 1 评论 -
详解CAS技术
无锁实现并发的几种方式:1. 锁2. CAS3. ThreadLocal变量;可重入性代码锁是一种悲观的策略,锁认为每次临界区的操作都会产生冲突,所以当有多个线程需要同时访问临界区资源,锁会阻塞线程执行无锁是一种乐观的策略,它假设所有对资源的访问都是没有冲突的,因此所有线程都可以不用阻塞的持续执行,一旦遇到冲突,无锁采用CAS(Compare And Swap)来鉴别冲突,一旦检测到冲突,则...原创 2018-06-05 22:53:56 · 6115 阅读 · 0 评论 -
详解BlockingQueue
BlockingQueueBlockingQueue接口主要实现: BlockingQueue中特有的put()和take()方法是Blocking的关键,这两个方法可以在队列为满,或者空的时候进行阻塞等到,当有新的任务被拿去执行或新的任务进入队列后,自动将线程唤醒BlockingQueue的实现与使用介绍添加元素的几种方法add():队列已满时,再添加会抛出异常——对应remove()offer...原创 2018-06-05 22:46:39 · 3090 阅读 · 1 评论 -
手写一个死锁程序
package DeadLock;/*写一个两个线程死锁的程序 * coded by Jerome */class MyDeadLock implements Runnable{ boolean flag; static Object o1 = new Object(); static Object o2 = new Object(); public MyDeadLock(bool...原创 2018-06-03 23:31:01 · 3708 阅读 · 6 评论 -
解密ThreadLocal
转载出处:http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6%E4%B9%A0%E4%B8%83]%E8%A7%A3%E5%AF%86ThreadLocal/ 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;T...转载 2018-06-03 23:05:37 · 498 阅读 · 0 评论 -
解密ThreadLocal
ThreadLocalThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。正是因为这是一个线程的局部变量,也就是说,只有在当前线程内部可以访问,因此是线程安全的,但是要注意,如果在应用上为每一个线程分配了相同的对象实例,那么ThreadLocal也不能保证线程安全。initialValue函数init...原创 2018-06-17 22:00:48 · 639 阅读 · 0 评论