JAVA并发编程
文章平均质量分 71
并发编程
我只是有点困呦
比较懒
展开
-
JAVA并发:未分析知识
原子操作类ForkJoin原创 2021-01-03 21:11:03 · 71 阅读 · 0 评论 -
JAVA并发:ThreadPoolExecutor
前言现在在实现异步时,基本都是使用线程池来实现,线程池在工作应用的还是比较频繁的,本文将就线程池的使用、相关原理和主要方法源码进行深入讲解学习。线程池的基本使用package com.joonwhee.concurrent;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;impor转载 2021-01-02 23:58:08 · 155 阅读 · 0 评论 -
JAVA并发:ThreadLocal
前言ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性。ThreadLocal无论在项目开发还是面试中都会经常碰到,本文就ThreadLocal的使用、主要方法源码详解、内存泄漏问题展开讨论。1.基本使用package com.joonwhee.imp;/** * demo * @author joonwhee * @date 2018年2月24日 */public class ThreadLocalDemo { publ转载 2020-12-13 21:42:47 · 110 阅读 · 0 评论 -
JAVA并发:ConcurrentLinkedQueue
概述ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,采用FIFO的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾;当我们获取一个元素时,它会返回队列头部的元素。用CAS实现非阻塞的线程安全队列。ConcurrentLinkedQueue 的非阻塞算法实现主要可概括为下面几点:使用 CAS 原子指令来处理对数据的并发访问,这是非阻塞算法得以实现的基础。head/tail 并非总是指向队列的头 / 尾节点,也就是说允许队列处于不一致状态。 这个特性把转载 2020-12-13 00:39:37 · 1754 阅读 · 0 评论 -
JAVA并发:阻塞队列
在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁) 等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。下面分析的是阻塞队列。1.什么是阻塞队列阻塞队列是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:当原创 2020-11-26 23:31:27 · 185 阅读 · 0 评论 -
JAVA并发: ConcurrentHashMap
文章目录1.并发下的HashMap1.1存在的问题1.2解决办法2.ConcurrentHashMap的使用3.ConcurrentHashMap的源码分析3.1JDK1. .7 7 和 J J8 dk1.8 版本的变化3.2重要成员变量3.3put操作3.3.1initTable数组初始化3.3.2tabAt获取bucket3.3.3addCount存储元素的个数3.3.3.1CounterCells 解释3.3.3.2fullAddCount3.3.3.3sumCount元素的个数3.3.4tran原创 2020-11-22 23:40:24 · 2180 阅读 · 1 评论 -
JAVA并发:并发工具类CountDownLatch、CyclicBarrier、Semaphore使用及源码分析
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别。1 CountDownLatch1.1 功能描述CountDownLatch是一个同步工具类,用来协调多个线程之间的同步。它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个原创 2020-10-10 00:06:30 · 346 阅读 · 0 评论 -
JAVA并发: ReentrantLock之Condition
1 Condition的基本使用在前面学习synchronized 的时候,有讲到 wait/notify的基本使用,结合 synchronized可以实现对线程间的通信,JUC并发包里面提供的同样的功能。Condition 是一个多线程协调通信的工具类里面提供了await/signal方法,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。1.1 简单案例public class LockConditionDemo { private static R原创 2020-09-23 23:54:58 · 517 阅读 · 0 评论 -
JAVA并发: ReentrantReadWriterLock读写锁
概述 读写锁之前提到锁(如Mutex和Reentrant Lock) 都是排他锁, 这些锁在同一时刻只允许一个线程进行访问, 而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。 除了保证写操作对读操作的可见性以及并发性的提升之外,读写锁能够简化读写交互场景的编程方式。假设在程序中定义一个共享的用作缓存数据结构,它大部分时间提供读服务(例如查询和搜索),原创 2020-09-20 00:25:38 · 223 阅读 · 0 评论 -
JAVA并发: ReentrantLock独占锁
概述介绍java并发包中的Lock锁的基本使用与实现细节。1 Lock接口lock锁可以实现和synchroinzed关键字类似的同步功能。Synchronized是关键字,内置语言实现,Lock是接口。Lock在使用的时候需要显示的去获取锁与释放锁,缺少比synchroinzed关键字的获取释放锁的便捷性。Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。Lock是可以中断锁,Synchroniz原创 2020-09-20 00:24:37 · 226 阅读 · 0 评论 -
JAVA并发: cpu缓存、volatile原理与内存模型
1. volatile的应用1.1 volatile的定义Java ,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获取这个变量。java语言提供了volatile,在某些情况下比加锁更加方便。如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。1.2 通过代码演示volatile的使用public class VolatileDemo { private static boolean stop = true; pu原创 2020-09-20 00:24:03 · 281 阅读 · 0 评论 -
JAVA并发:线程安全与Synchorinzed
1. 什么是线程安全问题线程的合理使用能够提升程序的处理性能,主要有两个方面,第一个是能够利用多核 cpu 以及超线程技术来实现线程的并行执行;第二个是线程的异步化执行相比于同步执行来说,异步执行能够很好的优化程序的处理性能提升并发吞吐量。同时也带来了很多麻烦。如:多线程对于共享变量访问带来的安全性问题一个变量 i,假如一个线程去访问这个变量进行修改,这个时候对于数据的修改和访问没有任何问题。但是如果多个线程对于这同一个变量进行修改,就会存在一个数据安全性问题。对于线程安全性,本质上是管理对于数据状态原创 2020-09-20 00:23:26 · 491 阅读 · 0 评论 -
JAVA并发:并发的基础
1. 创建线程1.1 Thread类和Runnable接口1.1.1 继承Thread类public class ThreadDemo { static class ChildThread extends Thread { @Override public void run() { System.out.println("childThread"); } } public static void mai原创 2020-09-20 00:22:16 · 227 阅读 · 0 评论