
Java并发编程
Geffin
欲戴王冠,必承其重
展开
-
处理数据你还用单线程?OUT 了老兄!赶快来试试多线程吧!
我跟老板说我只会单线程,他通知我去找财务把工资结一下原创 2020-12-10 20:20:28 · 361 阅读 · 6 评论 -
谈谈 ThreadLocal 的用途
文章目录前言用途管理 Connection避免参数传递应用:Spring 实现事务隔离级别应用:SimpleDataFormat 多线程下存在的问题内存泄露为什么 ThreadLocal 要使用 static 修饰总结前言ThreadLocal 提供了线程的局部变量,每个线程在对局部变量进行操作时,不会与其他线程的局部变量发生冲突,从而实现线程的数据隔离。那么,在了解了 ThreadLocal 的基本原理后,请大家思考一个问题,ThreadLocal 到底能做些什么呢?如果大家对 ThreadLoc原创 2020-09-24 17:43:26 · 348 阅读 · 0 评论 -
你真的了解线程安全吗?
冰冻三尺,非一日之寒前言线程安全,这个名词如同一座大山,经常出现在我们的工作,以及面试中。也许,关于线程安全的面试题你早已就倒背如流,但是,你真的了解线程安全吗?今天,我们回到最初的原点,从最基础的角度来看线程安全。线程的一些概念线程安全,好像听起来好高大上啊,但是这是啥意思呢,根本不懂啊!没事,语文老师教过我们,对于无法理解的概念,我们可以进行拆词。线程安全,即 “线程” + “安...原创 2020-04-11 16:26:14 · 450 阅读 · 0 评论 -
对 Java 四种线程池的简要分析
1 谈谈线程池在之前,我们在需要使用线程的时候就去创建一个线程,可谓是非常简便了。但是,当并发的线程数量多了之后,频繁创建线程会令系统的效率大大下降。那有没有办法可以令我们复用线程?线程在执行完一个任务之后,不会销毁,进而执行其他的任务呢?事实上,我们可以通过线程池实现相应的功能。在 Java 中,线程池的顶级接口是 Executor,但它并不是线程池的具体实现,真正的线程池实现类为 Thr...原创 2020-04-01 14:54:22 · 491 阅读 · 5 评论 -
弄懂 ThreadLocal,看这一篇就够了
1 什么是 ThreadLocal?ThreadLocal 是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。总的来说,ThreadLocal 提供了在线程内部存储变量的功能,且每一个线程读取的变量是互相独立的。2 set 方法我们如何设置当前线程对应的值呢?通过 set 方法即可。public void set(T value) { ...原创 2020-03-09 19:20:31 · 1616 阅读 · 0 评论 -
JVM 对 synchronized 的优化
1 前言我们都知道,synchronized 是重量级锁,其运行速度一直不敢恭维,万幸,JDK 1.6 之后为了减少获得锁和释放锁带来的性能消耗,引入了偏向锁和轻量级锁。锁的状态总共有四种,无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级为重量级锁,为了提高获得锁和释放锁的效率,锁的升级是单向的,即只有升级而不存在降级。2 偏向锁2.1 什么是偏向...原创 2019-12-12 22:21:34 · 916 阅读 · 5 评论 -
剖析 synchronized 的实现原理
1 synchronized 简介synchronized 是 Java 中的一个关键字,它是一个重量级锁,用于保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块,同时也可以保证可见性,即一个线程的变化可以被其他线程所见。2 synchronized 的三种应用2.1 修饰实例方法修饰实例方法即为为当前实例加锁。当一个线程正在访问一个对象的 synchronized 实例方法时,...原创 2019-12-12 18:45:36 · 846 阅读 · 2 评论 -
关于 Java 关键字 volatile 的总结
1 什么是 volatilevolatile 是 Java 的一个关键字,它提供了一种轻量级的同步机制。相比于重量级锁 synchronized,volatile 更为轻量级,因为它不会引起线程上下文的切换和调度。2 volatile 的两个作用可以禁止指令的重排序优化提供多线程访问共享变量的内存可见性3 禁止指令重排3.1 什么是指令重排指令重排序是 JVM 为了优化指令,提高...原创 2019-12-11 21:16:52 · 1063 阅读 · 5 评论 -
Java并发编程之ReentrantReadWriteLock
ReentrantReadWriteLock 定义Reentrant有可重入之意,从字面上看,ReentrantReadWriteLock 是一个可重入的读写锁。ReentrantReadWriteLock 的特点读写锁都可重入, 线程可同时具有读写锁线程同时获取读写锁时, 必须先获取 writeLock, 再获取 readLock (也就是锁的降级), 反过来的直接导致死锁(这个问题下...转载 2019-05-24 10:25:03 · 281 阅读 · 0 评论 -
Java并发编程之生产者/消费者模型
什么是生产者/消费者模型生产者和消费者在同一时间段内共用同一段存储空间,生产者向空间里生产数据,而消费者取走数据。场景模拟工厂里面汽车的零件生产与汽车组装是同时进行的,其中我们定义以下规则汽车组装必须有足够的零件支持零件生产与汽车组装(有足够的零件)互不影响为避免浪费,零件的储存上限为5(我们抽象为1个零件可以生产一辆汽车)下面我们使用wait() / notify()方法与aw...原创 2019-05-23 21:11:14 · 288 阅读 · 0 评论 -
Java并发编程之Condition
什么是ConditionCondition出现于java 1.5,主要用于实现线程间通信,用来替代传统的Object的wait()、notify()实现线程间的协作。与原来的方法相比,Condition提供的await()、signal()更为安全和高效,下面我们一起来走进Condition的学习吧。注意点:Condition实际上是一个接口,基本方法为await()方法和signal()...转载 2019-05-23 18:06:12 · 257 阅读 · 0 评论 -
Java并发编程之多线程常用方法
1 设置线程名称由于在一个进程中可能有多个线程,而多线程的运行状态又是不确定的,即不知道在多线程中当前执行的线程是哪个线程,所以在多线程操作中需要有一个明确的标识符标识出当前线程对象的信息,这个信息往往通过线程的名称来描述。public Thread(Runnable target,String name)该方法用于在创建线程的时候指定线程名称public final synchroni...转载 2019-05-23 13:47:03 · 301 阅读 · 0 评论 -
Java并发编程之Lock
我们都知道synchronized是一个提供同步访问的关键字,但在jdk1.5之后提供了另外一个方式来进行同步访问,那就是我们今天的主题,Lock。synchronized?Lock?我们知道,硬币有两个面,任何事物也有两面性,有利自然有弊。synchronized作为Java的一个关键字,自然不可违反自然规则,它不是十全十美的,在有些场景自然具有其局限性,下面我们来举几个例子。占有锁的线...原创 2019-05-20 20:02:18 · 365 阅读 · 2 评论 -
Java并发编程之AQS
什么是AQSAQS,AbstractQueuedSynchronizer,顾名思义,是抽象的队列式的同步器。AQS的作用AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞...转载 2019-05-21 00:04:46 · 311 阅读 · 0 评论 -
Java并发编程之ConcurrentHashMap
什么是ConcurrentHashMap我们知道,HashMap是线程不安全的。为解决HashMap在高并发环境下不能使用的问题,ConcurrentHashMap诞生了,实际上,我们可以认为ConcurrentHashMap是HashMap的线程安全版本。为什么不使用HashTable实际上,HashTable和HashMap的实现原理几乎一样,只是HashTable不允许key和valu...原创 2019-05-25 12:26:14 · 239 阅读 · 0 评论 -
Java并发编程之CopyOnWriteArrayList
什么是CopyOnWriteCopy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。什么是CopyOnWrite容器CopyOnWrite容器即写时复制的容器。当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容...原创 2019-05-25 17:44:28 · 360 阅读 · 0 评论 -
Java并发编程之ConcurrentSkipListMap
ConcurrentSkipListMap数据结构抓住了数据结构,对于理解整个ConcurrentSkipListMap有很重要的作用,其实,通过源码可知其数据结构如下。可以看到ConcurrentSkipListMap的数据结构使用的是跳表,每一个HeadIndex、Index结点都会包含一个对Node的引用,同一垂直方向上的Index、HeadIndex结点都包含了最底层的Node结点的...转载 2019-05-26 13:00:59 · 461 阅读 · 0 评论 -
Java并发编程之ArrayBlockingQueue
我们今天来介绍一个新概念,阻塞队列。阻塞队列当队列中为空时,从队列中获取元素的操作将被阻塞,当队列满时,向队列中添加元素的操作将被阻塞。ArrayBlockingQueueArrayBlockingQueue是一个由数组组成的有界队列。此队列按照先进先出的顺序进行排序。支持公平锁和非公平锁。ArrayBlockingQueue的继承关系public class ArrayBlockin...原创 2019-05-26 15:56:36 · 267 阅读 · 0 评论 -
Java并发编程之ReentrantLock
什么是ReentrantLockReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)开场白其实ReentrantLock并没有我...原创 2019-05-22 17:52:58 · 278 阅读 · 0 评论 -
Java并发编程之线程池原理剖析
在前面的学习中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我们就来...转载 2019-05-26 23:41:54 · 273 阅读 · 0 评论 -
Java并发编程之原子操作类
什么是原子操作类当更新一个变量的时候,多出现数据争用的时候可能出现所意想不到的情况。这时的一般策略是使用synchronized解决,因为synchronized能够保证多个线程不会同时更新该变量。然而,从jdk 5之后,提供了粒度更细、量级更轻,并且在多核处理器具有高性能的原子操作类。因为原子操作类把竞争的范围缩小到单个变量上,这可以算是粒度最细的情况了。原子操作类相当于泛化的volatil...原创 2019-05-20 15:41:44 · 1514 阅读 · 0 评论