并发编程
文章平均质量分 93
山鸟与鱼!
既然选择了这条路,就尽力做到最好!
展开
-
并发编程之MESI缓存一致性协议
当特定数据被多个缓存共享时,处理器修改了共享数据的值,更改必须传播到所有其他具有该数据副本的缓存中。CPU高速缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。缓存一致性协议会通过处理器之间的通信,确保在一个处理器修改了某个数据后,其他处理器缓存中的该数据会被更新或者失效,从而保证在多个处理器同时对同一个数据进行操作时,它们所看到的数据始终是一致的。这是最常用的窥探协议。原创 2024-01-18 17:38:07 · 1026 阅读 · 0 评论 -
并发编程之线程池ThreadPoolExecutor分析下
在线程池中有这么一个参数:allowCoreThreadTimeOut,表示是否允许核心工作线程超时,意思就是是否允许核心工作线程回收,默认这个参数为false,但是我们可以调用 allowCoreThreadTimeOut(boolean value)来把这个参数改为true,只要改了,那么核心工作线程也 就会被回收了,那这样线程池中的所有工作线程都可能被回收掉,那如果所有工作线程都被回收掉之后,阻塞队列中来了一个任务,此时就需要再添加一个线程,这样就形成了特例情况。原创 2024-01-18 15:18:51 · 1122 阅读 · 0 评论 -
并发编程之线程池ThreadPoolExecutor分析上
可以通过类来自定义线程池。自定义线程池可以更灵活地配置线程池的各种参数。// 使用 executor 执行任务// 关闭线程池corePoolSize是线程池的基本大小,maxPoolSize是线程池的最大大小,keepAliveTime是线程在没有任务执行时可以保持存活的时间。原创 2024-01-17 17:24:06 · 850 阅读 · 0 评论 -
并发编程之三大特性及JMM内存模型
在获取锁之前,线程 会将共享变量的最新值从主内存中读取到线程本地的缓存中,释放锁时会将修改后的共享变量的值刷 新到主内存中,以保证可见性。在多线程环境下,当多个线程访问共享变量时,如果其中一个线程在执行某个操作,其他线程不能同时执行该操作。如果操作A在操作B之前发生在之前(happens-before),那么操作A对于操作B来说,必定是可见的,而且操作A的效果将被操作B看到。作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机 遇到一个给变量赋值的字节码指令时执行这个操作。原创 2024-01-16 12:38:59 · 1034 阅读 · 0 评论 -
并发编程之阻塞队列
Java中,队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO)的原则管理元素。限定在一端进行插入,另一端进行删除的特殊线性表,允许出队的一端称为队头,允许入队的一端称为队尾。队列通常用于在数据集合中添加和删除元素的场景。在Java中,Queue接口扩展了java.util.Collection接口,提供了用于处理队列的方法。原创 2024-01-15 18:41:28 · 908 阅读 · 0 评论 -
并发编程之并发容器
当需要进行写操作时,它会创建一个新的数组,并将原始数组的内容复制到新数组中,然后进行写操作。jdk1.8抛弃了Segments分段锁的方案,而是改用了和HashMap一样的结构操作,也就是数组 + 链表 + 红黑树结构,比jdk1.7中的ConcurrentHashMap提高了效率,在并发方面,使用了cas + synchronized的方式保证数据的一致性。由于这类集合一般都是通过复制来实现读写分离的,因此它 们会创建出更多的对象,导致占用更多的内存,甚至可能引起频繁的垃圾回收,严重影响性能。原创 2024-01-14 19:20:01 · 853 阅读 · 0 评论 -
并发编程之ReentrantReadWriteLock详解
ReentrantReadWriteLock是Java中的一个读写锁实现,它允许多个线程同时读取共享资源(读读可以并发),但在写入时只允许一个线程独占(读写,写读,写写互斥)。这个锁支持重入,即同一个线程可以多次获取相同类型的锁。这种锁可以提高读操作的并发性,同时保证写操作的独占性。在读多于写的情况下,读写锁能够提供比排它锁更好的并发性和吞吐量。线程进入读锁的前提条件没有其他线程的写锁没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。原创 2024-01-13 19:46:06 · 1612 阅读 · 0 评论 -
并发编程之ReentrantLock源码分析
ReentrantLock类的大致结构,首先实现Lock接口,同时肯定需要实现Lock接口的一些方法,其次在ReentrantLock类中定义了一个Sync属性,是一个内部抽象静态类,同时Sync被finl修饰,表示一经定义不能再修改了。Sync继承AbstractQueuedSynchronizer类,同时定义了Lock接口并编写和重写了一些方法,NonfairSync类是对非公平锁的实现,FairSync类是对公平锁的实现。通过构造方法返回对象的不同来区分是使用那种类锁对象(后边会详细说明)。原创 2024-01-12 21:02:08 · 921 阅读 · 0 评论 -
并发编程之深入理解AQS
java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。JDK中提供的大多数的同步器如ReentrantLock, Semaphore、CountDownLatch等,都是基于AQS框架来实现的。原创 2024-01-11 18:28:22 · 1139 阅读 · 0 评论 -
并发编程之JUC并发工具类下
CyclicBarrier是Java中的并发工具类,用于在多个线程之间创建一个屏障,所有线程必须在这个屏障前等待,一旦所有线程都到达了屏障,屏障才会打开,允许所有线程继续执行。它与 CountDownLatch的区别在于,CountDownLatch是一次性的,而CyclicBarrier可以被重用,因为一旦屏障打开,它会被重置,可以再次使用。创建 CyclicBarrier时需要指定等待的线程数量,所有线程都到达之后,屏障被打破,所有线程同时继续执行。这对于周期性地执行同步操作的情况非常有用。原创 2024-01-10 18:28:12 · 874 阅读 · 0 评论 -
并发编程之JUC并发工具类上
ReentrantLock是Java中的一个并发工具类,可以实现可重入的互斥锁。与传统的synchronized关键字相比,ReentrantLock更加灵活,可以支持更复杂的并发控制。Semaphore是Java并发包中的一个同步工具类,它可以用来控制同时访问某个资源的线程数量。可用于控制并发线程数,可以用作同步工具。CountDownLatch是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。原创 2024-01-09 18:57:10 · 887 阅读 · 0 评论 -
并发编程之CAS&Atomic原子操作
CAS是“比较并交换”(Compare and Swap)的缩写。CAS是一种多线程同步的技术,用于实现多线程环境下的原子操作,常用于实现无锁的数据结构和线程安全算法。CAS 操作过程都包含三个运算符:一个内存地址 V,一个期望的值 A 和一 个新值 B,操作的时候如果这个地址上存放的值等于这个期望的值 A,则将地址 上的值赋为新值 B,否则不做任何操作。CAS 的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新 值,否则不做任何事儿,但是要返回原值是多少。原创 2024-01-09 00:12:32 · 891 阅读 · 0 评论 -
ThreadLocal内存泄漏与解决
是 Java 中的一个类,它提供了线程本地变量的支持。线程本地变量是指被线程拥有并独立于其他线程的变量。每个线程都可以独立地改变自己的副本,而不会影响其他线程的副本。主要用于在多线程环境下保持变量的线程封闭性,以实现线程安全。原创 2024-01-08 20:31:58 · 2327 阅读 · 0 评论 -
深入理解并发、线程与等待通知机制
这种机制是指一个线程 A 调用了对象 O 的wait()方法进入等待状态,而另一个线程 B 调用了对象O的notify()或者 notifyAll()方法,线程 A 收到通知后从对象 O 的 wait()方法返回,进而执行后续操作。在 Java 线程中,通过一个整型成员变量 priority 来控制优先级,优先级的范 围从 1~10,在线程构建的时候可以通过 setPriority(int)方法来修改优先级,默认 优先级是 5,优先级高的线程分配时间片的数量要多于优先级低的线程。原创 2024-01-07 19:23:45 · 874 阅读 · 0 评论