并发编程
文章平均质量分 71
QuantumBroken
这个作者很懒,什么都没留下…
展开
-
JDK 8 ArrayList并发问题
jdk8 ArrayList在并发添加元素的情况下,会丢元素和出现null的情况public class Test { private static List list = new ArrayList<>(); @SneakyThrows public static void main(String[] args) { testArrayList(); } private static void testArrayLis.原创 2021-10-01 22:34:33 · 179 阅读 · 0 评论 -
JDK8 HashMap也会死循环
前言我们知道JDK 7 HashMap是数组+链表数据结构,并发插入条件下,因为链表采用头插法,可能造成循环链表的问题,导致cpu占用100%JDK8 HashMap是数组+链表+红黑树的数据结构,应为链表改用尾插法,所有并发插入时没有了循环链表问题。但是红黑树一样会有死循环问题注意:HashMap并发条件下不止有死循环问题,还可能丢数据等等问题复现public class Test { private static Map<String, String> map = n原创 2021-10-01 22:28:44 · 701 阅读 · 0 评论 -
并发编程 概括
基本概念和原理进程和线程进程和线程需要从操作系统层面理解进程包括:唯一的进程标识可执行代码安全的上下文环境变量虚拟(内存)地址空间系统对象的引用,文件,设备,socket,窗口至少一个线程,这个线程称为主线程线程包括唯一的线程标识共享进程的虚拟(内存)地址空间共享进程的系统资源线程上下文本地线程存储总结进程是资源分配的最小单位,线程是CPU调度的最小单位。进程是对正在运行的程序的抽象,注意:一个程序可以有多个进程进程是线程的容器,一个进程包括一个或多个线程线程共享原创 2021-07-27 20:59:04 · 372 阅读 · 0 评论 -
并发编程0 基本概念
基本概念和原理进程和线程进程和线程需要从操作系统层面理解进程包括:唯一的进程标识可执行代码安全的上下文环境变量虚拟(内存)地址空间系统对象的引用,文件,设备,socket,窗口至少一个线程,这个线程称为主线程线程包括唯一的线程标识共享进程的虚拟(内存)地址空间共享进程的系统资源线程上下文本地线程存储总结进程是资源分配的最小单位,线程是CPU调度的最小单位。进程是对正在运行的程序的抽象,注意:一个程序可以有多个进程进程是线程的容器,一个进程包括一个或多个线程线程共享原创 2021-07-27 20:57:12 · 28 阅读 · 0 评论 -
并发编程1 java线程简要
线程状态 基本划分Tread.State结合 NewNEW新建 RunnableRUNNABLE就绪 Running运行中 BlockedBLOCKED阻塞 WAITING等待 TIMED_WAITING超时等待 DeadTERMINATED终止线程状态转化线程有关APITread类静态方法Thread currentThread() :获得当前线程的引用。获得当前线程后对其进行操作。boolean interrupted() :测试当前线程是否已经中断(将中断状态标记原创 2021-04-10 12:36:03 · 60 阅读 · 0 评论 -
并发编程2 java线程的中断机制
绝大部分内容引用自:http://ifeve.com/java-interrupt-mechanism/中断机制的缘由Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。注:stop()方法并不“安全”。中断机制是什么Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。例如,当线程t1想中断线程t2,只需要在线程t1中将线程t2对象的中断标识置为true,然后线程2可以选择在合适的时候处理该中断请求,甚至可以不理会该请转载 2021-04-10 12:23:41 · 55 阅读 · 0 评论 -
并发编程3 java中的锁概述
特性是否锁定资源:悲观锁、乐观锁多个线程是否可以共享锁:共享锁,排他锁同一个线程是否可以重复获取锁:可重入锁,不可重入锁多个线程竞争:公平锁、非公平锁(先插队,插队失败在排队)逻辑推导先有一个“普通锁”。乐观锁:悲观锁在并发量不高的情况下,每次加锁都要消耗性能。所以可以不加锁,而使用其他方式判断资源是否被改变过。如version,CAS但是在并发量高的情况下,就会造成反复修改,效率下降。共享/排他:对锁,资源,操作细分,提高性能。读读共享:ReentrantReadWri原创 2021-04-10 13:32:21 · 67 阅读 · 0 评论 -
并发编程4 synchronized实现原理
语法特性原理字节码 - Class文件synchronized关键字经过Javac编译之后, 会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令。 这两个字节码指令都需要一个reference类型的参数来指明要锁定和解锁的对象。如果Java源码中的synchronized明确指定了对象参数, 那就以这个对象的引用作为reference; 如果没有明确指定, 那将根据synchronized修饰的方法类型(如实例方法或类方法) , 来决定是取代码所在的对象实例还是原创 2021-04-16 10:49:26 · 50 阅读 · 0 评论 -
并发编程5 CAS和jdk Atomic
介绍Atomic类可以保证多线程环境下,当某个线程在执行atomic的方法时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个线程执行。Atomic类在软件层面上是非阻塞的,它的原子性其实是在硬件层面上借助相关的指令来保证的,因此性能高于自己加锁。分类AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference // CAS不防止ABAAtomicIntegerArray,AtomicLon原创 2021-04-10 17:01:01 · 55 阅读 · 0 评论 -
并发编程6 JUC.locks包之Lock接口等
特性可重入互斥公平/非公平ReentrantLock简介类图Lock接口Lock接口中常用的方法是lock()/unlock()。lock()不能被中断,对应的lockInterruptibly()可以被中断。ReentrantLock本身没有代码逻辑,实现都在其内部类SyncSyncSync是一个抽象类,它有两个子类FairSync与NonfairSync,分别对应公平锁和非公平锁。从下面的ReentrantLock构造方法可以看出,会传入一个布尔类型的变量fair指定锁原创 2021-04-10 13:15:22 · 146 阅读 · 0 评论 -
并发编程7 阻塞队列 BlockingQueue:Queue,Deque及Blocking
关系Queue接口add 添加offer 添加,不会抛出异常remove 移除一个元素,空集合抛出异常poll 移除一个元素,空集合返回nullelement 查询一个元素,不在队列中删除,空集合抛出异常peek 查询一个元素,不在队列中删除,空集合返回nullBlockingQueue extends Queueput 添加一个元素,如果队列已满阻塞take 移除一个元素,如果队列已空阻塞Deque extends Queue 双端队列addFirst 添加addLas原创 2021-04-10 17:16:27 · 138 阅读 · 0 评论 -
并发编程8 java集合的并发处理
中心思想CopyOnWrite指在“写”的时候,不是直接“写”源数据,而是把数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回。那为什么不直接修改,而是要拷贝一份修改呢?这是为了在“读”的时候不加锁。本质上是空间(copy)换时间(读不加锁)CopyOnWriteArrayListCopyOnWriteArraySetCopyOnWriteArrayList读方法不加锁写方法加锁,如add()// 锁对象final transient Object lock = new Obje原创 2021-04-10 18:45:31 · 356 阅读 · 0 评论 -
并发编程9 Java线程池 ThreadPoolExector
思想池化技术池化技术应用:线程池、数据库连接池、http连接池等等。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。通过将资源池化,统一管理,可以方便管控。例如提供资源监控,调度策略等能力线程池的好处降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,监控和调优。原理原创 2021-04-12 01:46:17 · 144 阅读 · 0 评论 -
并发编程10 多线程编程 及 jdk多线程工具类
种类Semaphore:信号量CountDownLatch:“倒计数器”CyclicBarrier:循环屏障,篱栅Phaser:阶段转移器Exchanger:交换器Semaphore作用Semaphore:信号量,提供了资源数量的并发访问控制。ReentrantLock可重入锁使得资源仅能被一个线程访问,Semaphore可以允许不超过指定数量的线程共同访问。API使用 // 一开始有5份共享资源。第二个参数表示是否是公平 Semaphore myResources = new原创 2021-04-11 00:16:06 · 92 阅读 · 0 评论