
多线程
文章平均质量分 74
Java多线程
crazy_xieyi
任何信手拈来的从容,都是厚积薄发的沉淀
展开
-
线程安全的集合类(多线程环境下使用ArrayList、队列及哈希表)
1. 多线程环境下使用ArrayList2. 多线程环境下使用队列3. 多线程环境下使用哈希表:ConcurrentHashMap进行了哪些优化?比HashTable好在哪里?和HashTable之间的区别是啥?Hashtable和HashMap、ConcurrentHashMap 之间的区别?ConcurrentHashMap在jdk1.8做了哪些优化?ConcurrentHashMap的读是否要加锁?原创 2023-02-02 14:43:04 · 2243 阅读 · 23 评论 -
多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch
一、Callable接口1.Callable的用法2.小结二、ReentrantLock1.ReentrantLock 的用法2.ReentrantLock 和 synchronized 的区别?3.为什么有了 synchronized 还需要 juc(java.util.concurrent) 下的 lock?三、信号量 Semaphore1.如何理解信号量?2.信号量可以用在过哪些场景下?3.线程同步的方式有哪些?四、CountDownLatch是同时等待 N 个任务执行结束原创 2023-01-31 08:12:51 · 1455 阅读 · 6 评论 -
多线程之CAS
CAS全称 Compare and swap, 即 "比较并交换"。相当于通过一个原子的操作, 同时完成 "读取内存, 比较是否相等, 修改内存" 这三个步骤,本质上需要 CPU 指令的支撑。解决CAS带来的问题需要给要修改的数据引入版本号。在 CAS 比较数据当前值和旧值的同时, 也要比较版本号是否符合预期。如果发现当前版本号和之前读到的版本号一致, 就真正执行修改操作, 并让版本号自增; 如果发现当前版本号比之前读到的版本号大, 就认为操作失败。原创 2023-01-29 09:59:10 · 2296 阅读 · 10 评论 -
synchronized 原理(锁升级、锁消除和锁粗化)
关于锁升级,根据锁竞争的情况,synchronized从无锁、偏向锁、轻量级锁和重量级锁升级。关于锁消除,编译器智能的判定,看当前的代码是否是真的要加锁,如果这个场景不需要加锁,程序猿也加了,那么就会自动把锁给干掉。关于锁粗化,通常情况下,认为锁的粒度细一点比较好。加锁的部分的代码,是不能并发执行的,锁的粒度越细,能并发的代码就越多;反之就越少。但是有些情况下,锁的粒度粗一些反而更好,两次加锁解锁之间,间隙非常小,此时,不如就直接一次大锁搞定得了。原创 2023-01-19 08:00:00 · 1548 阅读 · 14 评论 -
多线程之常见的锁策略
一、乐观锁 VS 悲观锁二、互斥锁 VS 读写锁三、轻量级锁 VS 重量级锁四、自旋锁 VS 挂起等待锁五、公平锁 VS 非公平锁六、可重入锁 VS 不可重入锁原创 2023-01-17 06:30:00 · 1169 阅读 · 19 评论 -
线程池(关于变量捕获、线程数、针对ThreadPoolExecutor的构造方法参数的解释、自实现线程池)
一:相比较于进程,创建线程 / 销毁线程 的开销是相对较小的,但是太过频繁的创建线程 / 销毁线程,其开销也很大。这时候我们就需要使用线程池来减少每次启动和销毁线程的损耗。事先把需要使用的线程先创建好,然后放到线程池中,后面需要使用的时候,直接从池里面获取,如果用完了就还给池。二、关于变量捕获三、针对ThreadPoolExecutor的构造方法参数的解释四、自实现线程池原创 2023-01-15 10:14:58 · 950 阅读 · 9 评论 -
实现定时器(基于标准库提供的定时器、基于优先级队列自实现的定时器)
一、基于标准库提供的定时器二、基于优先级队列自实现的定时器原创 2023-01-14 09:35:18 · 563 阅读 · 16 评论 -
生产者消费者模型(基于标准库提供的阻塞队列、基于环形数组自实现的阻塞队列)
一、基于标准库提供的阻塞队列实现生产者消费者模型二、基于环形数组自实现的阻塞队列实现生产者消费者模型原创 2023-01-13 09:38:14 · 372 阅读 · 16 评论 -
多线程之wait¬ify
wait 需要搭配 synchronized 使用,sleep 不需要;wait 是 Object 的方法 ,sleep 是 Thread 的静态方法。notify()方法是用来通知同一个对象上等待的线程,对其发出通知notify,并使它们重新获取该对象的对象锁。如果有多个线程等待,则有线程调度器随机挑选出一个呈 wait 状态的线程。notifyAll和notify是非常相似的,当多个线程wait 的时候, notify随机唤醒一个, notifyAll所有线程都唤醒,这些线程再来一起竞争锁。原创 2023-01-11 08:45:50 · 879 阅读 · 25 评论 -
关于volatile解决内存可见性问题(保证线程安全)
volatile是不保证原子性的,原子性是靠synchronized来保证的。但是volatile和synchronized都能保证线程安全。在多线程中,针对同一个变量,一个线程进行读取,一个线程进行修改,那么加上volatile关键字可以保证线程安全问题。原创 2023-01-09 08:45:45 · 1209 阅读 · 26 评论 -
多线程之死锁
发生死锁的三个典型情况:1.一个线程针一把锁连续加锁两次。如果锁是不可重入锁,就会死锁。2.两个线程两把锁,t1先对锁A加锁,t2先对锁B加锁,然后各自再尝试获取对方的锁,就会死锁。3.多个线程多把锁。破除死锁的办法就是给锁编号,然后指定一个固定的顺序(比如从小到大)来加锁。任意线程加多把锁的时候,都让线程遵守上述顺序,此时循环等待就自然破除了。原创 2023-01-07 09:44:40 · 1446 阅读 · 30 评论 -
多线程之线程安全问题
线程安全问题的原因有如下:1.根本原因:线程都是抢占式执行的,随机调度的。2.代码结构原因:多个线程同时修改同一个变量。在有些时候,是可以通过调整代码结构来避免的。一个线程修改一个变量是没问题的,多个线程读取同一个变量也是没有问题的,多个线程修改不同的变量也是没问题的。3.原子性:如果修改操作是原子性的,就可以避免了,针对线程安全问题,最主要的解决手段也是从原子性这个方面进行入手的。4.内存可见性问题:如果一个线程读,一个线程修改,那么此时读取的结果可能不如预期值。5.指令重排序原创 2023-01-05 08:39:17 · 1974 阅读 · 26 评论 -
多线程之Thread类常见方法及线程的状态
Thread类常见方法:创建、启动线程、终止线程、线程等待、获取线程实例、线程休眠。线程的状态:1.NEW创建了Thread对象,但是还没调用start(内核里还没创建对应PCB)。2.TERMINATED表示内核中的pcb已经执行完毕了,但是Thread对象还在。3.RUNNABLE可运行的(正在运行或者就绪)。4.阻塞(WAITING/TIMED_WAITING/BLOCKED),表示线程pcb正在阻塞队列中。原创 2023-01-03 09:07:04 · 2563 阅读 · 24 评论 -
单例模式之饿汉模式&懒汉模式
饿汉模式即使在多线程情况下,也是线程安全的,因为只涉及到读操作。通过对单线程版的懒汉模式不断改进得到了多线程安全的懒汉模式。原创 2022-12-30 08:46:16 · 1397 阅读 · 17 评论 -
Java中创建线程的五种方式
前言:1.进程与线程的区别?2.进程是操作系统进行资源分配的基本单位,而操作系统是以线程为单位进行调度的。3.Java操作多线程,依赖最核心的类Thread。4.关于start和run的区别?5.使用JDK自带的工具jconsole来查看当前java进程中的所有线程。Java中创建线程的五种写法:1.继承Thread,重写run2.实现Runnable接口3.使用匿名内部类,继承Thread4.使用匿名内部类,实现Runable5.使用Lambda表达式原创 2022-12-28 08:04:39 · 1274 阅读 · 15 评论 -
浅谈操作系统和进程
操作系统是一个软件,对下要管理硬件设备,对上要给软件运行提供稳定的运行环境。操作系统是软硬件及用户之间交互的媒介。进程是操作系统资源分配的基本单位,每个进程都对应一些资源。在Java中一般会基于文件或网络来进行进程间通信。进程调度相关的属性有进程状态、优先级、上下文和记账信息。原创 2022-12-04 09:29:41 · 1910 阅读 · 26 评论