Java 多线程
文章平均质量分 70
java 多线程方面的知识
May Hacker
无所谓才能无所畏!我会变得更强!
展开
-
Leetcode 三个线程顺序执行
题目重述题解Java AC1.利用Java提供的原子类class Foo { private AtomicInteger atomicInteger = new AtomicInteger(0); public Foo() { } public void first(Runnable printFirst) throws InterruptedException { // printFirst.run()原创 2022-01-25 18:45:00 · 186 阅读 · 0 评论 -
Java JUC核心 AQS相关整理
前言原理AQS维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)。不同的自定义同步器争用共享资源的方式也不同。自定义同步器在实现时只需要实现共享资源state的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤原创 2021-12-16 15:36:18 · 811 阅读 · 0 评论 -
Java多线程- wait/notify机制
必须使用synchorized代码块进行控制wait()、notify()完之后,若notify()仍占有锁,那么wait()对应线程也是没办法执行的,因为获取不到锁原创 2021-07-12 18:44:19 · 272 阅读 · 0 评论 -
Java多线程拾遗(十一) LockSupport类
LockSupport是什么?“用于创建锁和其他同步类的基本线程阻塞原语。 ”,对于JDK官方文档上的介绍,听起来并不好懂。是对线程唤醒机制Wait/Notify机制的改良版,提供Park()和unPark()两个方法来阻塞线程和解除阻塞。Wait/Notify机制相对于LockSupport不好的地方?Wait/Notify必须需要synchronized关键字加锁,才能使用,不然会有异常。Wait/Notify必须先Wait,再Notify,顺序若相反,则阻塞不会被唤醒。Conditiona原创 2021-06-07 17:51:25 · 168 阅读 · 0 评论 -
Java 线程池 | ThreadPoolExecutor的认识与使用
构造方法ThreadPoolExecutor总共有四个构造方法下面这个是最核心的,其他三个都基于该构造方法来构造。 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepA...原创 2020-03-05 13:38:34 · 451 阅读 · 0 评论 -
聊一聊对用Redis实现分布式锁的理解(基于setnx和基于Redisson的尝试)
减库存业务为防止超卖,怎么做?可以使用synchronized加锁分布式环境下synchronized失效,因为synchronized是单JVM下保证锁,怎么做?使用Redis的setnx命令,如果能修改key返回true,说明获取到key,加锁成功,最后将key删掉,便于下个减库存。业务出现异常,没有释放锁(删掉key)怎么办?使用try catch finally ,在finally中删掉key中途宕机的话锁就不会被释放,中途宕机怎么办?解决方案可以是加锁时,给key设置过期时间。如原创 2021-02-22 12:31:18 · 1916 阅读 · 1 评论 -
Java ThreadLocal | 实现线程之间数据隔离
前言ThreadLocal的作用主要是做线程之间的数据隔离,原理 ???? 在于每个线程保留一份自己的数据,所以数据对别的线程而言是相对隔离的,在多线程环境下,能够防止自己的变量被其它线程篡改。简单使用一下public class Test { public static void main(String[] args) { // 声明ThreadLocal ThreadLocal<String> threadLocal = new ThreadLo原创 2021-01-27 17:06:38 · 1828 阅读 · 3 评论 -
对公平锁和非公平锁的理解
公平锁想使用资源?一个个按顺序排队!好处也就是排队的好处,大家伙慢慢排,最终大家都有资源用。坏处就是除了排队的第一个人,都得等着排队,想都别想拿到,对应线程的阻塞,但要知道,事实上CPU唤起阻塞线程的代价是比较高的。非公平锁不想排队? 那就插队!多个人同时去抢资源,有人先抢到,那么其他人就会进入等待队列,进行阻塞。好处在于,可以减少CPU唤起阻塞线程的开销。坏处在于,可能会出现操作系统中讲过的"饿死"现象,即长时间获取不到资源。...原创 2021-01-16 12:29:46 · 200 阅读 · 0 评论 -
Java 多线程拾遗(十) Semaphore理解
Semaphore简介Semaphore翻译为中文是信号量的意思,如果学过操作系统的话,会接触到这个概念,并且Semaphore的用法与操作系统中的PV操作是类似的。A counting semaphore. 一个计数信号量,这是JDK源码给出的介绍,不难猜到Semaphore就是通过计数,来对资源占用进行控制的。初次之外,Semaphore是java.util.concurrent下的类,如果我们学习多线程并发控制,也绕不开concurrent包。Semaphore使用最普遍的使用方法可以通过下原创 2021-01-06 10:54:20 · 295 阅读 · 0 评论 -
Java多线程拾遗(九) Volitate关键字特性分析
前言编译器为了加快程序运行的速度,对一些变量的写操作会先在寄存器或者是CPU缓存上进行,最后才写入内存.而在这个过程,变量的新值对其他线程是不可见的.而volitate的作用就是使它修饰的变量的读写操作都必须在内存中进行。 这样就保证了volitate修改的变量具有可见性,也就是某个线程更改了这个变量,其他线程再去读主内存,想要修改这个值时,前一个线程的修改对当前线程是可见的。volatile关键字的两层语义一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层原创 2020-06-25 11:24:50 · 6284 阅读 · 0 评论 -
Java多线程拾遗(七) ReadWriteLock接口解析及ReentrantReadWriteLock实现类
ReadWriteLock 的概念ReadWriteLock见词知意,读写锁的意思。它是Java并发包JUC中的一个接口,主要有两个方法,如下:public interface ReadWriteLock { Lock readLock(); Lock writeLock();}ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。这两个锁可以实现允许同时读,不能同时写的特性。ReadWriteLock 的实现类ReentrantReadWriteLock实现原创 2020-06-03 09:25:18 · 216 阅读 · 0 评论 -
Java多线程拾遗(八) BlockingQueue阻塞队列
BlockingQueue阻塞队列原创 2020-06-02 18:32:31 · 244 阅读 · 0 评论 -
Java多线程拾遗(六) CyclicBarrier的使用
CyclicBarrier的概念从字面上的意思可以知道,这个类的中文意思是“循环屏障”。可以理解为就是一个可循环利用的屏障。通俗点讲,它就是一个加法计数器,初始指定一个值,表示,每执行一个线程,这个线程都会调用await()方法进行阻塞,等待其他线程。类似于大家一起骑车,有快的有慢的,对于骑车快的,到一个目标点后等待其他人,直到所有人都到达这个目标点后,再一起结束。 这个目标点可以看做是屏障。CyclicBarrier 使用示例public class CyclicBarrierDemo {原创 2020-06-02 09:18:47 · 320 阅读 · 2 评论 -
Java多线程拾遗(五) 使用CountDownLatch同步线程
CountDownLatch 是什么?先看看CountDownLatch源码注释第一行给出的定义。让一个或多个线程等待,直到在其他线程中执行的一组操作完成的同步辅助程序我们在编码中很多时候需要多线程来提高效率,而有时候我们需要让一个或一些线程完成一些任务后,再继续向下执行代码,而CountDownLatch作为一个同步工具类,能够满足这样的需求。CountDownLatch能够使一个线程在等待另外一些线程都完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线原创 2020-06-01 20:55:55 · 267 阅读 · 0 评论 -
Java多线程拾遗(四) 使用ReentrantLock和synchronized来保证线程安全
前言在多个线程,同时对共享资源进行操作时,会因为线程不安全,造成数据错误。在java中有不同的锁机制来避免这一问题,除此之外,还有一些线程安全的集合也供我们使用。可能我们耳熟能详的是某些集合是线程安全的,某些是线程不安全的。线程安全的集合保证线程安全的方法也不是都一样的。今天我们看看如何使用可重入锁ReentrantLock和synchronized来保证线程安全。线程不安全的情况在j...原创 2020-03-18 23:53:26 · 792 阅读 · 0 评论 -
java多线程拾遗(三) 霸道的join()方法
前言相信每个人都有原创 2020-03-18 14:03:16 · 233 阅读 · 0 评论 -
java多线程拾遗(二) 使用yield()方法来实现线程之间的礼让
前言Thread类中有一个方法叫做yield(),作用在于实现线程的礼让,即多个线程一块跑,某个线程礼让的话,就是让这个线程由运行状态进入就绪状态,让CPU重新调度。需要注意的是,礼让不一定成功。下面是jdk中的源码,它是一个native方法,native关键字有什么用呢?使用native关键字,能够说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C...原创 2020-03-18 13:34:49 · 398 阅读 · 0 评论 -
java多线程拾遗(一) 创建线程的三种方式
前言java创建线程的三种方式分别是继承Thread类、 实现Runnable接口、 实现Callable接口。继承Thread这种方式是通过新建继承于Thread的类,并重写run()方法来实现的,run()方法主要是指定你要让这个线程为你做什么 public static void main(String[] args) { Thread add...原创 2020-03-18 10:58:46 · 239 阅读 · 0 评论