并发编程
代码学习
代码
展开
-
Synchronized 与 volatile 区别?
synchronized和volatile的区别:一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是 立即可见的。 2)禁止进行指令重排序。 volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需...转载 2019-05-13 20:48:52 · 163 阅读 · 0 评论 -
Java中的乐观锁——无锁策略CAS算法
题主在阅读《实战Java高并发程序设计》一书时,了解到了Java无锁的相关概念,在此记录下来以加深对其的理解,Java中的锁分为两种即为悲观锁和乐观锁,那么何为悲观锁和乐观锁呢?乐观锁与悲观锁悲观锁是我们代码经常用到的,比如说Java中的synchronized和ReentrantLock等独占锁就是悲观锁思想的实现,它总是假设别的线程在拿数据的时候都会修改数据,所以在每次拿到数据的时候都会上...转载 2019-08-06 22:20:40 · 229 阅读 · 0 评论 -
Semaphore 信号量
Semaphore的作用:在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如打印机房有多个打印机、厕所有多个坑可供同时使用,这种情况下,Java提供了另外的并发访问控制–资源...转载 2019-08-06 22:33:44 · 125 阅读 · 0 评论 -
自旋锁
原创 2019-08-06 22:41:39 · 181 阅读 · 0 评论 -
线程池重要参数 线程池执行顺序
转载 2019-09-10 19:31:36 · 2031 阅读 · 0 评论 -
sleep和wait的区别
sleep和wait的区别还有:1。这两个方法来自不同的类分别是Thread和Object2。最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。3。wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用4。sleep必须捕获异常,而wait,notify和notifyAll不需要捕...原创 2019-09-10 19:38:36 · 210 阅读 · 0 评论 -
锁优化
锁的优化策略编码过程中可采取的锁优化的思路有以下几种:1、减少锁持有时间例如:对一个方法加锁,不如对方法中需要同步的几行代码加锁;2、减小锁粒度例如:ConcurrentHashMap采取对segment加锁而不是整个map加锁,后来又对node加锁,提高并发性;3、锁分离根据同步操作的性质,把锁划分为的读锁和写锁,读锁之间不互斥,提高了并发性。4、锁粗化这看起来与思路1有冲...转载 2019-09-10 20:24:37 · 151 阅读 · 0 评论 -
BIO,NIO,AIO整理(全称,介绍,区别)
原创 2019-09-11 10:06:42 · 340 阅读 · 0 评论 -
关于java线程锁synchronized修饰普通方法与静态方法的区别
最近研究线程方面问题,关于这个synchronized锁修饰的问题,先是修饰普通方法,然后通过两个线程,各自执行自己对象的锁,发现方法执行互不影响,代码如下: private static int num=0; private synchronized void printNum(String tag){ try { if(tag.equals("a")){ n...转载 2019-09-25 14:34:12 · 213 阅读 · 0 评论 -
分类说明JUC包常用类有哪些
JUC中常用类汇总JUC的atomic包下运用了CAS的AtomicBoolean、AtomicInteger、AtomicReference等原子变量类JUC的locks包下的AbstractQueuedSynchronizer(AQS)以及使用AQS的ReentantLock(显式锁)、ReentrantReadWriteLock附:运用了AQS的类还有:Semaphore、CountD...原创 2019-07-22 21:38:30 · 9076 阅读 · 0 评论 -
Java多线程实现的三种方式、区别
1.1.三种使用线程的方法实现 Runnable 接口;实现 Callable 接口;继承 Thread 类。实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线程,因此最后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。实现 Runnable 接口1、需要实现 run() 方法。2、通过 Threa...原创 2019-06-30 16:28:52 · 2789 阅读 · 0 评论 -
线程死锁
1.1.什么是线程死锁?多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态。下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况 (代码来源于《并发编程之美》):public class Dea...原创 2019-06-29 19:20:40 · 147 阅读 · 0 评论 -
Synchronized 和 ReentratLock的区别
两者的区别Reentrantlock 可响应中断、可轮询;synchronized是不可响应中断的。Lock可以让等待锁的线程响应中断,synchronized等待的线程会一直等待下去,不能够响应中断。Lock可以使用Condition进行线程之间的调度;Condition可以认为是监视器,一个对象可以有多个Condition监视器,每个监视器都可以注册一个线程,使用的调度方法为sin...原创 2019-05-29 19:49:46 · 602 阅读 · 0 评论 -
synchronized 关键字深入学习+单例模式
1.1. 说一说自己对于 synchronized 关键字的了解synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Jav...原创 2019-06-27 15:48:10 · 616 阅读 · 0 评论 -
volatile关键字深入学习
1.1、讲一下Java内存模型在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量。而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致要解决这个问题,就需要把变量声明为volatile,这就...原创 2019-06-27 16:18:50 · 158 阅读 · 0 评论 -
ThreadLocal深入学习
1.1. ThreadLocal简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个Thre...原创 2019-06-27 16:38:30 · 129 阅读 · 0 评论 -
线程池
1.1. 为什么要用线程池?这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗==》通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度==》当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性==》线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。1...原创 2019-06-27 21:17:44 · 146 阅读 · 0 评论 -
Atomic 原子类
1.1.介绍一下 Atomic 原子类Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原子类都存放...转载 2019-06-28 21:03:47 · 283 阅读 · 0 评论 -
AQS
1.1.AQS 介绍AQS 的全称为(AbstractQueuedSynchronizer),类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,这个类在 java.util.concurrent.locks 包下面。参考资料:https://www.cnblogs.com/waterystone/p/4920797.html...原创 2019-06-28 22:29:46 · 3317 阅读 · 0 评论 -
线程的生命周期和状态
1.1.线程状态Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态(图源《Java 并发编程艺术》4.1.4 节)。线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示(图源《Java 并发编程艺术》4.1.4 节):由上图可以看出:线程创建之后它将处于 NEW(新建) 状态,调用 sta...原创 2019-06-29 17:15:52 · 1005 阅读 · 0 评论 -
常用的并发集合
并发List Vector和CopyOnWriteArrayList是两个线程安全的List,Vector读写操作都用了同步,相对来说更适用于写多读少的场合,CopyOnWriteArrayList在写的时候会复制一个副本,对副本写,写完用副本替换原值,读的时候不需要同步,适用于写少读多的场合。并发Set CopyOnWriteArraySet基于CopyOnWriteArrayL...转载 2019-10-10 14:23:25 · 233 阅读 · 0 评论