随笔分类 -  Java并发编程

摘要:​ 我在前面总结了Java集合中 "ArrayList的源码细节" ,其中也提到了ArrayList是线程不安全的(没有做任何的同步保证),也说到了fast fail机制以及多线程下使用ArrayList的异常问题。当然也包括单线程下使用不当: 。 ​ 那么jdk中为我们提供的线程安全的List是什 阅读全文
posted @ 2019-08-04 17:04 夏末秋涼 阅读(1474) 评论(0) 推荐(0)
摘要:在并发编程中,我们可能经常需要用到线程安全的队列,JDK提供了两种模式的队列:阻塞队列和非阻塞队列。阻塞队列使用锁实现,非阻塞队列使用CAS实现。ConcurrentLinkedQueue是一个基于链表实现的无界线程安全队列,对于。下面看看JDK是如何使用非阻塞的方式来实现线程安全队列Concurr 阅读全文
posted @ 2019-08-03 19:41 夏末秋涼 阅读(372) 评论(0) 推荐(0)
摘要:HashMap的结构图示 ​ jdk1.7的HashMap采用数组+单链表实现,尽管定义了hash函数来避免冲突,但因为数组长度有限,还是会出现两个不同的Key经过计算后在数组中的位置一样,1.7版本中采用了链表来解决。 ​ 从上面的简易示图中也能发现,如果位于链表中的结点过多,那么很显然通过key 阅读全文
posted @ 2019-07-31 19:23 夏末秋涼 阅读(1227) 评论(1) 推荐(0)
摘要:AQS概述 ​ AbstractQueuedSynchronizer抽象队列同步器简称AQS,它是实现同步器的基础组件,juc下面Lock的实现以及一些并发工具类就是通过AQS来实现的,这里我们通过AQS的类图先看一下大概,下面我们总结一下AQS的实现原理。先看看AQS的类图。 ​ (1) AQS是 阅读全文
posted @ 2019-07-31 10:24 夏末秋涼 阅读(39633) 评论(2) 推荐(6)
摘要:非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略使得很多线程不需要因为竞争失败直接挂起,这种同步措施称为非阻塞同步。下面我们就从硬件原语开始了解非阻 阅读全文
posted @ 2019-06-15 16:43 夏末秋涼 阅读(1097) 评论(0) 推荐(0)
摘要:一、ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全 阅读全文
posted @ 2019-06-14 11:34 夏末秋涼 阅读(336578) 评论(7) 推荐(50)
摘要:一、线程池简介 线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供更好的性能,在不使用线程池时候,每当需要执行异步任务的时候直接new一个线程来运行的话,线程的创建和销毁都是需要开销的。而线程池中的线程是可复用的,不需要每次执行异步任务的时候重新创建和销毁线程;②线程池提供一种 阅读全文
posted @ 2019-06-13 14:25 夏末秋涼 阅读(2128) 评论(0) 推荐(0)
摘要:一、Condition接口 1、Condition接口的常用方法介绍 Condition的使用模板:Condition的获取必须通过Lock的newCondition方法,表示Condition对象与该锁关联,一般讲Condition对象作为成员变量,调用上面的await方法之后当前线程才会释放锁并 阅读全文
posted @ 2019-04-17 09:23 夏末秋涼 阅读(1642) 评论(0) 推荐(1)
摘要:一、读写锁 1、初识读写锁 a)Java中的锁——Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,在写线程访问的时候其他的读线程和写线程都会被阻塞。 阅读全文
posted @ 2019-04-17 09:18 夏末秋涼 阅读(26493) 评论(1) 推荐(2)
摘要:上一篇Java中的队列同步器AQS 一、Lock接口 1、Lock接口和synchronized内置锁 a)synchronized:Java提供的内置锁机制,Java中的每个对象都可以用作一个实现同步的锁(内置锁或者监视器Monitor),线程在进入同步代码块之前需要或者这把锁,在退出同步代码块会 阅读全文
posted @ 2019-04-14 22:36 夏末秋涼 阅读(23008) 评论(0) 推荐(3)
摘要:首先简单介绍一下volatile的应用,volatile作为Java多线程中轻量级的同步措施,保证了多线程环境中“共享变量”的可见性。这里的可见性简单而言可以理解为当一个线程修改了一个共享变量的时候,另外的线程能够读到这个修改的值。下面就是volatile的具体定义和实现原理。上一篇Java内存模型 阅读全文
posted @ 2019-03-25 18:22 夏末秋涼 阅读(774) 评论(0) 推荐(0)
摘要:一、synchronized 关键字 1)synchronized 锁什么?锁对象。可能锁对象包括: this, 临界资源对象,Class 类对象。如同下面例子所示; 2)如果在加锁的时候对当前对象的访问限定要求比较低的时候,建议锁某一段代码或者某一个对象;如果访问限定要求比较高的话,建议锁当前对象 阅读全文
posted @ 2019-02-28 01:58 夏末秋涼 阅读(695) 评论(0) 推荐(0)