Java进阶之并发编程(六)ThreadLocal
一、引言ThreadLocal 是一个 Java 提供的线程局部变量类。它的主要作用是为每个线程提供独立的变量副本,使得每个线程都可以独立地修改自己所拥有的变量副本,而不会影响其他线程的副本
二、源码分析1.ThreadLocalMapThreadLocalMap是实现ThreadLocal的根本所在,因此分析ThreadLocalMap的代码即可了解ThreadLocal的实现原理
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980static class ThreadLocalMap { /** * 内部类Entry,使用弱引用 */ static class Entry extends WeakReference<ThreadLocal<?>> { ...
Java进阶之并发编程(五)ConcurrentHashMap
一、引言1.随便说说ConcurrentHashMap在jdk1.8之前,即1.7的时候,采用的是分段锁+数组+链表的技术
但是这样会存在一些问题,如下:
1.分段锁存在性能瓶颈,不能支持很高的并发量
2.链表解决冲突,在极端情况下会导致链表过长查询性能下降
因此,本文主要介绍jdk1.8实现的ConcurrentHashMap源码
此外,像哈希表中的get,set,size等方法过于简单,此处不会进行分析
仅对put,扩容,计算元素数量做详细介绍
2.简单比较相比1.7版本的ConcurrentHashMap,1.8版本的ConcurrentHashMap进行了一次很好的优化,主要在以下方面:
1.分段锁 -> CAS
不再采用分段锁技术,插入时仅锁某一个槽,并且使用CAS进行元素操作,极大的提升了并发性能
2.数组+链表 -> 数组+链表+红黑树
引入红黑树解决哈希冲突,提升了插入和查询效率
二、参数解析1.容量相关参数123456789101112131415161718192021222324252627282930313233343536373839/** * ...
Java进阶之并发编程(四)Condition
一、线程的通信1.通信方式
共享内存:多个线程共享同一块内存空间,可以直接在内存中读写数据进行通信。
互斥锁:使用互斥锁来实现对共享资源的访问控制,确保同一时间只有一个线程能够访问共享资源,从而避免多个线程同时对资源进行读写而导致数据不一致的问题。
条件变量:条件变量通常和互斥锁一起使用,用于线程之间的信号传递。一个线程可以等待某个条件变量被触发,另一个线程可以通过发送信号来触发条件变量,从而唤醒等待该条件变量的线程。
信号量:信号量是一种用于线程间同步和互斥的机制。它可以用于多个线程之间的同步,以确保它们在互斥资源上的访问顺序正确。
管道:管道是一种用于进程间通信的机制,但也可以用于线程之间的通信。一个线程可以将数据写入管道,另一个线程可以从管道中读取数据,从而实现线程之间的数据传输。
消息队列:消息队列是一种用于进程间通信的机制,但也可以用于线程之间的通信。一个线程可以向消息队列发送消息,另一个线程可以从消息队列中读取消息,从而实现线程之间的数据传输。
线程间经常使用wait/notify/notifyAll进行通信,这种方式属于条件变量通信
wait ...
Java进阶之并发编程(三)AQS详解
一、什么是JUCJUC指的是Java并发编程工具包(Java Concurrency Utilities),它提供了一系列的工具类和接口,用于简化并发编程的开发。虽然Java语言中已经提供了synchronized关键字来支持多线程并发编程,但是JUC提供了更加灵活和高效的实现方式,以满足更加复杂的并发编程需求。
具体来说,JUC提供了以下几个重要的类和接口:
Lock和Condition:Lock和Condition是替代synchronized关键字的工具,它们提供了更加灵活和可控的线程同步机制,使得在高并发情况下能够更加高效地协调线程之间的交互。
Semaphore:Semaphore是一种计数信号量,它可以用来控制同时访问某个资源的线程数量。
CountDownLatch:CountDownLatch是一种倒计数器,它可以让一个线程等待多个其他线程执行完毕后再继续执行。
CyclicBarrier:CyclicBarrier也是一种倒计数器,它可以让多个线程相互等待,直到所有线程都到达某个屏障点后再一起继续执行。
Executor和ExecutorService:Execut ...
Java进阶之并发编程(二)volatile关键字
一、什么是线程安全的可见性与有序性先看如下案例,在该样例中,线程外将stop改为true之后,理论上线程会跳出while循环进而终止,但是实际运行会发现线程依然继续运行,为什么会出现这种情况呢?
123456789101112131415public class VolatileDemo { public static boolean stop=false; public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(()->{ int i=0; while(!stop){ i++; } }); t1.start(); System.out.println("begin start thread"); Thread.sleep(1000); ...
Java进阶之设计模式
一、设计原则1.接口隔离原则核心思想:将接口拆分成多个小的、专门的接口,避免大而全的接口导致实现类必须实现无用的方法,从而提高代码的灵活性、可扩展性和可维护性。
解析:即接口要分割的足够小,功能尽量高内聚,不要太多冗余方法
以下是一个满足接口隔离原则的正例。假设我们有一个图形类Shape,它有一个计算面积的方法calculateArea()和一个计算周长的方法calculatePerimeter()。我们可以将这两个方法拆分成两个接口AreaCalculatable和PerimeterCalculatable,然后让实现Shape类的类只实现它们需要的接口。这个设计可以避免实现一个不需要的接口。
123456789101112131415161718192021222324252627public interface AreaCalculatable { double calculateArea();}public interface PerimeterCalculatable { double calculatePerimeter(); ...










