
JAVA多线程并发
JAVA多线程并发类博客
FYHannnnnn
知道的越多,不知道的也就越多
展开
-
JAVA中volatile关键字
Volatile请参考《Java编程思想》P681参考:深入解析Java中volatile关键字的作用 和 Java 理论与实践: 正确使用 Volatile 变量Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是...转载 2018-08-29 15:58:25 · 147 阅读 · 0 评论 -
Java CountDownLatch应用
转载自https://zapldy.iteye.com/blog/746458Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。 你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的...转载 2019-06-20 16:10:07 · 99 阅读 · 0 评论 -
Synchronized使用与原理
一、Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法: (1)修饰普通方法 (2)修饰静态方法 (3)修饰代码块 接下来我就通过几个例子程序来说明一下这三种使用方式(为了便于比较,三段代码除了Synchronized的转载 2020-08-07 14:56:20 · 146 阅读 · 0 评论 -
原生锁Synchronized ,浅谈乐观锁与悲观锁
一、JVM对原生锁的优化自旋:一种优化是使用自旋锁,即在把线程进行阻塞操作之前先让线程自旋等待一段时间,可能在等待期间其他线程已经解锁,这时就无需再让线程执行阻塞操作,避免了用户态到内核态的切换。以及加入的CAS。二、Synchronized 是非公平锁 、是一个悲观锁非公平主要表现在获取锁的行为上,并非是按照申请锁的时间前后给等待线程分配锁的,每当锁被释放后,任何一个线程都有机会竞争到锁,这样做的目的是为了提高执行性能,缺点是可能会产生线程饥饿现象。不管是否会产生竞争,任何的数据操作都必须转载 2020-08-10 16:05:00 · 732 阅读 · 0 评论 -
ReenTrantLock 与synchronized 区别
ReenTrantLock可重入锁(和synchronized的区别)总结可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。锁的实现:Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的.转载 2020-08-10 16:08:17 · 826 阅读 · 0 评论 -
Java锁粗化与锁消除
锁粗化通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽可能短,但是大某些情况下,一个程序对同一个锁不间断、高频地请求、同步与释放,会消耗掉一定的系统资源,因为锁的讲求、同步与释放本身会带来性能损耗,这样高频的锁请求就反而不利于系统性能的优化了,虽然单次同步操作的时间可能很短。锁粗化...转载 2020-08-10 16:15:14 · 344 阅读 · 0 评论 -
Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲: 概述 框架 源码详解 简单应用 二、框架 它维护了一个volatile i转载 2020-08-10 16:48:41 · 162 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法一.CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一转载 2020-08-10 17:14:47 · 315 阅读 · 0 评论 -
浅谈AQS中的ReentrantLock、ReentrantReadWriteLock、StampedLock与Condition
ReentrantLock概述Java中主要分为两类锁,一类是synchronized修饰的锁,另外一类就是J.U.C中提供的锁。J.U.C中提供的核心锁就是ReentrantLock。ReentrantLock(可重入锁)与synchronized区别:(1)可重入性二者都是同一个线程进入1次,锁的计数器就自增1,需要等到锁的计数器下降为0时,才能释放锁。(2)锁的实现synchronized是基于JVM实现的,而ReentrantLock是JDK实现的。(3)性能的区别sy转载 2020-08-11 09:41:59 · 169 阅读 · 1 评论 -
Java中线程池的实现原理
初始化线程池(4种)简介:Java线程池的工厂类:Executors类,初始化4种类型的线程池:newFixedThreadPool()说明:初始化一个指定线程数的线程池,其中corePoolSize == maxiPoolSize,使用LinkedBlockingQuene作为阻塞队列特点:即使当线程池没有可执行任务时,也不会释放线程。newCachedThreadPool()说明:初始化一个可以缓存线程的线程池,默认缓存60s,线程池的线程数可达到Integer.MAX_VALUE转载 2020-08-11 13:01:18 · 143 阅读 · 0 评论 -
volatile关键字解析
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。 也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高转载 2020-08-11 13:04:49 · 156 阅读 · 0 评论 -
ThreadLocal如何解决并发问题
前言到底什么是线程的不安全?为什么会存在线程的不安全?线程的不安全其实就是多个线程并发的去操作同一共享变量没用做同步所产生意料之外的结果。那是如何体现出来的呢?我们看下面的一个非常经典的例子:两个操作员同时操作同一个银行账户,A操作员存钱,100B操作员取钱50。我们看一下流程。两个操作员同时处理,没用做同步这个时候我们发现银行账户最终余额剩余950元,在我们想的最终结果银行账户应该剩余1000+100-50=1050元,在执行过程中我们没有加锁,最终导致了运行结果偏离预期。那么如何解决的?一般转载 2020-08-11 13:06:56 · 1195 阅读 · 1 评论