Java 并发工具包 | J.U.C

简介: Java 并发工具包 | J.U.C 不知道大家还有没有印象,上次我们已经说过了,我们为了实现集合相关类的线程安全,JDK 提供了一套同步容器,也就是 Vector,Hashtable,还有一个 Collections 工具类中的几个方法。

Java 并发工具包 | J.U.C

不知道大家还有没有印象,上次我们已经说过了,我们为了实现集合相关类的线程安全,JDK 提供了一套同步容器,也就是 Vector,Hashtable,还有一个 Collections 工具类中的几个方法。

 

问题是什么呢,同步容器并不能保证线程安全,我在们写代码的时候还需要注意一些方法的使用,在 JDK 1.5 及以后就出现了 java.util.current 包,这个包中就提供了大量的类来实现线程安全,这也就是我们经常说的 JUC。

 

举例例子吧,与 HashMap 对应的线程安全的容器,ConcurrentHashMap 就是出自这个包。

 

稍微整理了一下这个包中都包含了哪些功能,做个思维导图。

 

 

不得不说,这其中的知识点非常多,我这只是列出了一部分,作为大纲,我呢也不可能都说,用到的类也很少,目前工作基本接触不到这些类的使用。

 

但是吧,我还是强烈建议有基础的同学看看源码,膜拜一下大神。

 

我就简单说几个面试常问的,并发容器,atomic 包,Lock 和其实现类,线程池。

 

并发容器最最常问的就是 ConcurrentHashMap 的原理,四个字分段加锁。使用的是 synchronized 代码块加锁,只不过锁的范围不再是整个 table ,而是一个一个的 Node。

 

原子包中的原子类主要就是提供了一些不需要加锁就能保证原子性操作的一些方法,我们不使用锁进行同步,而是使用算法来保证操作的原子性,主要涉及的算法是 CAS,核心方法就是 compareAndSwap。这个方法是实现是 native 的,嗯,不是 Java 实现的。

 

算法思想就是我拿工作内存中的值和主存中的值进行比较,若是一样我才操作,不一样那就修改主存中的值,继续比较直到满足条件。这样做也就保证了主内存和工作内存中的值一致。

 

有个有趣的事情,CAS 是定义在一个 Unsafe 类中的。有么有想过,尽然还有这么有意思的类名,原来这个类是由 sun 公司提供的,之所以命名为 Unsafe 是因为 GC 的时候不能回收这个类,所以官方不建议使用。

 

嗯,在 CAS 算法中还有可能出现 ABA 问题,就是说在读取内存中变量的时候看起来没有变化,可能是已经又变回来了,解决的方法就是每次修改变量的时候都会加上一个版本号,同时比较版本号和变量的值是否改变。

 

ReentrantLock 名为可重入锁,就是说一个线程在获得一个锁之后,再次获取该锁时,不需要重新等待获取。ReentrantLock 又分为公平锁和非公平锁,公平锁指的是严格按照先来先得的顺序排队等待去获取锁,而非公平锁每次获取锁时,是先直接尝试获取锁,获取不到,再按照先来先得的顺序排队等待。

 

ReentrantReadWriteLock 可重入读写锁,指的是没有线程进行写操作时,多个线程可同时进行读操作,当有线程进行写操作时,其它读写操作只能等待。可以多线程一起读但是一旦有写就需要等着,有较好的并发行和吞吐量。

 

线程频繁的创建和销毁是很浪费资源的,所以我们就创建一个线程池用来保证有一部分线程始终处于待命状态,来任务了可以立马执行,这也是线程池的优点,提高资源的利用率,提高了请求响应的速度,而且我们还可以管理已经创建的线程。

 

线程池主要关注点在线程池创建的 7 个参数上,我们并发量很小的时候,待命的线程过多也是浪费大量的资源,所以关于性能调优,这些没有定论,要根据自身的业务场景。

 

参数主要是线程池的大小,最大线程数,设置空闲时间,线程过多时使用何种阻塞队列,创建线程的工厂是什么,当阻塞队列也满了时,采用什么策略来处理后续线程。

 

东西真的好多,我这只是说了一丢丢,好多东西我只是知道但是没有用过,我是感觉脱离业务的技术意义不大,虽然学起来感觉很牛逼,但是用不到的我也就止步于此了,大家加油,至少拓展了我们的思路,再接触时不会怂!

原文地址https://www.cnblogs.com/YJK923/p/10529719.html

相关文章
|
1月前
|
Java 数据安全/隐私保护
JAVA包
JAVA包
12 0
|
13天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
34 3
|
5天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
7天前
|
Java 开发者
Java中多线程并发控制的实现与优化
【4月更文挑战第17天】 在现代软件开发中,多线程编程已成为提升应用性能和响应能力的关键手段。特别是在Java语言中,由于其平台无关性和强大的运行时环境,多线程技术的应用尤为广泛。本文将深入探讨Java多线程的并发控制机制,包括基本的同步方法、死锁问题以及高级并发工具如java.util.concurrent包的使用。通过分析多线程环境下的竞态条件、资源争夺和线程协调问题,我们提出了一系列实现和优化策略,旨在帮助开发者构建更加健壮、高效的多线程应用。
7 0
|
8天前
|
存储 缓存 安全
Java并发基础之互斥同步、非阻塞同步、指令重排与volatile
在Java中,多线程编程常常涉及到共享数据的访问,这时候就需要考虑线程安全问题。Java提供了多种机制来实现线程安全,其中包括互斥同步(Mutex Synchronization)、非阻塞同步(Non-blocking Synchronization)、以及volatile关键字等。 互斥同步(Mutex Synchronization) 互斥同步是一种基本的同步手段,它要求在任何时刻,只有一个线程可以执行某个方法或某个代码块,其他线程必须等待。Java中的synchronized关键字就是实现互斥同步的常用手段。当一个线程进入一个synchronized方法或代码块时,它需要先获得锁,如果
24 0
|
16天前
|
存储 缓存 安全
【企业级理解】高效并发之Java内存模型
【企业级理解】高效并发之Java内存模型
|
23天前
|
安全 Java
Java中的多线程并发控制
在Java中,多线程是实现并发执行任务的一种重要方式。然而,随着多个线程同时访问共享资源,可能会导致数据不一致和其他并发问题。因此,了解并掌握Java中的多线程并发控制机制显得尤为重要。本文将深入探讨Java的多线程并发控制,包括synchronized关键字、Lock接口、Semaphore类以及CountDownLatch类等,并通过实例代码演示其使用方法和注意事项。
12 2
|
28天前
|
缓存 NoSQL Java
Java项目:支持并发的秒杀项目(基于Redis)
Java项目:支持并发的秒杀项目(基于Redis)
26 0
|
29天前
|
算法 安全 Java
Java中的并发编程:理解并发性能优化
在当今软件开发领域,多核处理器的普及使得并发编程变得更加重要。本文将深入探讨Java中的并发编程,介绍并发性能优化的关键技术,帮助开发人员更好地利用多核处理器提升应用程序性能。
|
1月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
92 3