Java并发
程序猿渣渣帅
技术、生活、观点、个人成长。 主要关注互联网电商广告业务、数据分析方法论、大数据分析平台建设;java web、分布式、大数据处理以及可视化等相关技术。
展开
-
java并发知识点整理
1、锁对象1.1、lock和condition(ReentrantLock())Lock lock = new ReentrantLock();lock.lock();try {...} finally {lock.unlock();}注意一定要释放锁,一般写在finally中。 1.2、可重入锁:线程可以重复的获取已经持有的锁,锁通过以及持有的计数器来...原创 2018-07-24 00:11:45 · 229 阅读 · 0 评论 -
java线程安全的实现方法
目录一、互斥同步二、非阻塞同步三、无同步方案一、互斥同步同步指的是在多个线程并发访问共享数据的时候,保证共享数据在同一个时刻只能被一个(或者是一些,使用信号量的时候)线程使用。而互斥是实现同步的一种手段,临界区、互斥量、信号量都是主要的互斥实现方式。因此,在这四个字里面,互斥是因,同步是果;互斥是方法,同步是目的。二、非阻塞同步 三、无同步方案 ...原创 2018-08-06 23:28:45 · 142 阅读 · 0 评论 -
非阻塞无锁同步(CAS硬件同步原语)
目录1、CAS简介2、对比Synchronized 和 CAS3、CAS的应用场景4、 CAS存在的问题1)、 ABA问题2)、 自旋时间过长3)、只能保证一个共享变量的原子操作CAS的实现需要硬件指令集的支撑,在JDK1.5后虚拟机才可以使用处理器提供的CMPXCHG指令实现。1、CAS简介CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和...原创 2018-08-06 21:42:16 · 680 阅读 · 0 评论 -
volatile原理解析
目录一、volatile型变量的内存语义1、保证此变量对所有线程的可见性2、禁止指令重排序优化。二、volatile变量的非原子性实例1、volatile i++;2、典型的禁止重排优化的例子DCL(单例模式的双重检测)三、happens-before原则和volatile的内存语义1、volatile与happens-before2、volataile的内存语...原创 2018-08-07 10:37:24 · 309 阅读 · 0 评论 -
java内存模型JMM
目录 一、并发编程模型的分类二、计算机物理机处理并发的处理方式(JVM虚拟机处理并发的情况类似)三、Java内存模型的抽象四、内存基本的交互操作五、重排序1、重排序分三种2、处理器重排序与内存屏障指令六、happens-before一、并发编程模型的分类在并发编程中,有两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)...原创 2018-08-06 20:13:53 · 143 阅读 · 0 评论 -
Java虚拟机是如何执行线程同步的
目录 1、线程和共享数据2、对象和类的锁3、监视器(Monitors,内置锁)4、多次加锁5、同步1、线程和共享数据Java编程语言的优点之一是它在语言层面上对多线程的支持。这种支持大部分集中在协调多个线程对共享数据的访问上。JVM的内存结构主要包含以下几个重要的区域:栈、堆、方法区等。在Java虚拟中,每个线程独享一块栈内存,其中包括局部变量、线程调用的每个方...原创 2018-08-06 21:37:46 · 241 阅读 · 0 评论 -
java内存模型---原子性、可见性与有序性
Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立的,我们逐个看下哪些操作实现了这三个特性。1、原子性(Atomicity)由Java内存模型来直接保证的原子性变量包括read、load、assign、use、store和write,我们大致可以认为基本数据类型的访问读写是具备原子性的。如果应用场景需要一个更大方位的原子性保证,Java内存模型还提供了loc...原创 2018-08-07 10:10:42 · 1199 阅读 · 0 评论 -
java并发内存模型以及内存操作规则(八种原子操作)
java并发内存模型以及内存操作规则java内存模型中规定了所有变量都存贮到主内存(如虚拟机物理内存中的一部分)中。每一个线程都有一个自己的工作内存(如cpu中的高速缓存)。线程中的工作内存保存了该线程使用到的变量的主内存的副本拷贝。线程对变量的所有操作(读取、赋值等)必须在该线程的工作内存中进行。不同线程之间无法直接访问对方工作内存中变量。线程间变量的值传递均需要通过主内存来完成。...原创 2018-08-07 10:10:29 · 7436 阅读 · 4 评论 -
Java内存模型happens-before原则
一、happens-before原则在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。happens-before原则定义如下:1. 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。 2. 两个操作之间存在happens-before...原创 2018-08-07 11:18:28 · 301 阅读 · 0 评论 -
Java内存模型的底层原理
1、指令重排序在执行程序时,为了提高性能,编译器和处理器会对指令做重排序。但是,JMM确保在不同的编译器和不同的处理器平台之上,通过插入特定类型的Memory Barrier来禁止特定类型的编译器重排序和处理器重排序,为上层提供一致的内存可见性保证。编译器优化重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。指令级并行的重排序:如果不存l在数据依赖性,处理器可以改变...原创 2018-08-07 14:29:05 · 378 阅读 · 0 评论 -
synchronized原理解析
目录一、synchronized的使用场景二、原理分析1、同步方法2、同步代码块3、对象,对象监视器,同步队列以及执行线程状态之间的关系4、总结三、synchronized在原子性、可见性和有序性的体现1、synchronized与原子性2、synchronized与可见性3、synchronized与有序性四、synchronized锁优化(提高...原创 2018-08-06 14:02:31 · 1172 阅读 · 1 评论 -
多线程同步器CountDownLatch、CyclicBarrier和Semaphore
一、简要概述1、CountDownLatch(不可重复使用,一次性的)当一个或多个线程需要等待指定数目的时间发生(允许线程集等待直到计数器减为0,否则会一直阻塞在调用latch.await()处)CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭...原创 2018-08-01 13:08:22 · 648 阅读 · 0 评论 -
对象的共享
一、内存可见性 在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行顺序进行判断,几乎无法得出正确的结论。 使用volatile修饰的变量,最低安全性适合于绝大多数的变量,非volatile类型的64位数值变量(long,double)。 加锁的行为不仅是实现互...原创 2018-07-30 23:50:22 · 203 阅读 · 0 评论 -
锁活跃性问题(死锁,饥饿、活锁)
一、死锁 每个人都拥有其他人需要的资源,同时又等待其他人已经拥有的资源,并且每个人在获取所有需要的资源之前都不会放弃已经拥有的资源。 当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,这个我们都知道。如果线程A持有锁L并且想获得锁M,线程B持有锁M并且想获得锁L,那么这两个线程将永远等待下去,这种情况就是最简单的死锁形式。其中多...原创 2018-07-29 22:10:05 · 1205 阅读 · 0 评论 -
并发编程模型的分类
在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存(隐式通信,显示同步)和消息传递(显示通信,隐式同步)。1、在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。2、在消息传递...原创 2018-07-29 22:19:49 · 553 阅读 · 0 评论 -
java内存屏障和重排序问题
java内存屏障和重排序问题原创 2018-07-29 22:20:36 · 383 阅读 · 2 评论 -
多线程Thread问题总结
一、关于锁的几点总结1、线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。2、线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他同步方法3、对于静态同步方法,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁,当在一个同步方法中访问另外对象上...原创 2018-07-29 22:43:36 · 514 阅读 · 0 评论 -
java锁分类总结
1、可重入锁 锁的重入性:如果某个线程试图获得一个由它自己持有的锁,如果这个请求成功,那么这个锁具有重入性(内置锁具有重入性);如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁,可重入性表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说me...原创 2018-07-29 22:54:27 · 1650 阅读 · 1 评论 -
锁的性能与可伸缩性
一、资源密集型的操作定义当操作性能由于某种特定的资源而受到限制时,我们通常将该操作称为资源密集型的操作。如,CPU密集型、数据库密集型。二、多线程和单线程对比的缺点尽管使用多个线程可以提升整体的性能,但是和单个线程相比,多线程会引入一定额外的开销,包括:线程之间的协调(加锁、触发信号、内存同步等)、增加上下文的切换、线程的创建和销毁,以及线程的调度等。三、可伸缩性定义当增加计算...原创 2018-07-29 23:54:42 · 435 阅读 · 0 评论 -
java内存模型JMM
一、并发编程模型的分类在并发编程中,有两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明...原创 2018-07-30 10:25:15 · 140 阅读 · 0 评论 -
Java并发---同步器
同步器 信号量(Semaphore) 倒计时门栓(CountDownLatch) 障栅 (CyclicBarrier) 交换器 (Exchanger) 同步队列(SynchronousQueue) CountDownLatch和CyclicBarrier区别...原创 2018-07-26 21:02:52 · 728 阅读 · 0 评论 -
显式锁Lock和读写锁ReadWriteLock
一、显式锁Lock特点:可轮询的、定时的以及可中断的锁获取操作、非快结构的加锁(对应于synchronized的加锁和释放都是在同一块代码块中)public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException;//可中断锁(在获取锁的时候可以响应中断) bo...原创 2018-07-27 10:27:39 · 567 阅读 · 0 评论 -
线程的安全性
出现安全性问题的原因:对共享的和可变的状态访问如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么就会出现错误,有三种方式修复这个问题:a、不在线程之间共享该状态变量;b、将状态变量修改为不可变的变量;c、在访问状态变量的时候使用同步; 1、线程安全性(核心正确性)当多个线程访问某个类时,这个类始终都能够表现出正确的行为,那么就称之为这个类是线程安全的。注释...原创 2018-07-30 23:40:04 · 207 阅读 · 0 评论 -
AtomicInteger的实现原理
AtomicInteger:使用非阻塞算法(无锁定无等待)实现并发控制,相比synchronized和Lock(阻塞算法)实现,更加高效一、硬件同步原语:比较并交换 (CAS) CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在 CA...原创 2018-08-03 16:07:34 · 4523 阅读 · 0 评论