Java并发编程
Master.TJ
https://github.com/fengruotj
展开
-
Java高并发编程(五):Java中的锁Lock
1. Lock接口锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。Lock接口提供的sy...原创 2018-12-25 14:13:28 · 880 阅读 · 1 评论 -
Java高并发编程(六):重入锁
重入锁定义:重入锁ReentrantLock,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。ReentrantLock锁的公平性问题:非公...原创 2018-12-25 14:36:46 · 530 阅读 · 0 评论 -
Java高并发编程(七):读写锁、LockSupport、Condition
读写锁定义:读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。一般情况下,读写锁的性能都会比排它锁好,因为大多数场景读是多于写的。在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。Java并发包提供读写锁的实现是ReentrantRea...原创 2018-12-25 15:19:15 · 654 阅读 · 0 评论 -
Java高并发编程:性能与线程竞争
线程的最主要目的是提高程序的运行性能,线程可以使程序更加充分地发挥系统地可处理能力,从而提高系统的资源利用率。此外,线程还可以使程序在运行现有的任务的情况下即开始处理新的任务。但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险1.对性能的思考提升性能意味着用更少的资源做更多地事情。要想通过并发来获得更好的性能,就要更有效地利用现有处理资源线程使用的额外的性能开销:线程之间的协调(...原创 2019-01-11 09:40:26 · 976 阅读 · 1 评论 -
Java基础:由JVM内存模型详解线程安全
1.前言最近在研究JVM内存模型和Java基础知识。主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码。这里列出一条规则,“类中的成员变量,也叫实例变量,也叫全局变量,它是非线程安全,是所有线程共享的变量,定义在方法中的私有变量是线程安全的,是每个线程私有的”。那么我们如何通过JVM内存模型来理解这句话。现在汇总知识如下:2. Java虚拟机运行时的数据区通过上面这幅图片我们可...原创 2018-12-09 14:41:58 · 847 阅读 · 0 评论 -
Java高并发编程:Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。...原创 2019-01-07 16:34:10 · 507 阅读 · 0 评论 -
Java高并发编程:取消和关闭
Java没有提供任何机制来安全地终止线程,但是它提供了中断(Interruption).这是一种协作机制,能够使一个线程终止另一个线程当前的工作。在对一个线程对象调用Thread.interrupted()方法之后,一般情况下对这个线程不会产生任何影响。因为调用Thread.interrupted()方法只是将增线程的中断标志位设置为true。如果一个线程被调用Thread.interru...原创 2019-01-09 11:44:08 · 2411 阅读 · 0 评论 -
Java高并发编程:活跃性危险
Java高并发程序中,不得不出现资源竞争以及一些其他严重的问题,比如死锁、线程饥饿、响应性问题和活锁问题。在安全性与活跃性之间通常存在依赖,我们使用加锁机制来确保线程安全,但是如果过度地使用加锁,则可能导致锁顺序死锁(Lock-Ordering DeadLock)。1.死锁死锁定义:当一个线程永远地持有一个锁,并且其他线程都尝试获取这个锁的时候,那么它们将永远被阻塞。在线程A持有L锁并且想获...原创 2019-01-10 10:38:18 · 668 阅读 · 0 评论 -
Java高并发编程(十二):Executor框架
Java中的线程既是工作单元,也是执行单元。工作单元包括Runnable和Callable,而执行单元是由Executor框架支持。1. Executor框架简介1.1 Executor框架的两级调度模型在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个...原创 2018-12-29 18:51:14 · 785 阅读 · 0 评论 -
Java高并发编程(十一):Java中线程池
在开发过程中,合理地使用线程池能够带来3个好处。降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。1. 线程池的使用原理从图中可以看出,当提交一个新任务到线程...原创 2018-12-29 18:51:08 · 897 阅读 · 0 评论 -
Java高并发编程(一):并发编程的挑战
1.简介 并发编程的目的是为了让程序运行的更快,但是,并不是启动更多的线程就能让程序最大限度地运行,在并发编程的时候还需要面对一些众多的挑战。在进行并发编程的时候,如果希望通过多线程执行任务让程序运行得更快、会面临非常多的挑战。比如上下文的切换的问题、死锁的问题、以及所限制与硬件和软件环境的问题。1.1 上下文切换 即使是单核处理器也支持多线程执行代码,CPU通过给每个...原创 2018-06-28 19:39:02 · 655 阅读 · 0 评论 -
Java高并发编程:总线锁定和缓存一致性的问题
随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。 我们知道,CPU和物理内存之间的通信速度远慢于CPU的处理速度,所以CPU有自己的内部缓存,根据一些规则将内存中的数据读取到内部缓存中来,以加快频繁读取...原创 2018-06-28 20:57:42 · 2089 阅读 · 1 评论 -
Java高并发编程(二):Java并发机制的底层实现机制
Java代码在编译后会变成Java字节码,字节码在之后被类加载机制加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。1 深入理解 Volatile关键字 volatile是轻量级的synchronized,它在处理器开发中保证了共享变量的“可见性”。可见性的意思就是当一个线程修改一个共享...原创 2018-06-28 22:26:48 · 1935 阅读 · 1 评论 -
Java高并发编程(三):Java内存模型
1 Java内存模型的基础在并发编程里,需要处理两个问题:线程之间如何通信线程之间如何同步。通信指的是线程之间以何种机制来交换信息。在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传递。 Java的并发采用的是共享内存模型。1.1 Java内存模型的抽象结构Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。...原创 2018-12-22 20:28:12 · 751 阅读 · 0 评论 -
Java高并发编程(八):Java并发容器和框架
1. ConcurrentHashMap1.1 ConcurrentHashMap的优势在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会。线程不安全的HashMap: 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并...原创 2018-12-29 18:49:11 · 2506 阅读 · 0 评论 -
Java高并发编程(四):并发编程基础
1. 线程简介1.1 线程的定义现代操作系统调度的最小单元是线程,也叫轻量级进程(LightWeight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。1.2 使用多线程编程的好处更多的处理器核心更快的响应时间更好的编程模型1.3 线程...原创 2018-12-24 10:50:34 · 546 阅读 · 0 评论 -
Java高并发编程(九):Java中原子操作类
Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。1. 原子更新基本类型使用原子的方式更新基本类型,Atomic包提供了以下3个类。AtomicBoolean:原子更新布尔类型。AtomicInteger:原子更新整型AtomicLong...原创 2018-12-29 18:49:45 · 581 阅读 · 1 评论 -
Java高并发编程(十):Java并发工具类
1. 等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。1.1 应用场景假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。1.2 CountDownLatch实现原理 public void...原创 2018-12-29 18:51:02 · 1097 阅读 · 0 评论