![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA多线程
文章平均质量分 74
流光亦流连
这个作者很懒,什么都没留下…
展开
-
情景题:生产者和消费者模型
基于数组的形式实现了生产者与消费者的模型,代码如下:public class ConsumerAndProducer { final Object[] items;// 生产队列 int putIndex; //生产者指针 int takeIndex; //消费者指针 int count;//产品总数 final ReentrantLock lock;//锁 private final Condition notEmpty; //对应消费者的condit原创 2022-01-03 10:00:19 · 1345 阅读 · 1 评论 -
CopyOnWrite线程安全集合
一、CopyOnWrite集合简介CopyOnWrite集合包括CopyOnWriteArrayList,CopyOnWriteSet和CopyOnWriteHashMap,但CopyOnWriteHashMap使用较少,并发环境大多采用性能更高的cpncurrentHashMap。其实现线程安全的核心思想是读写分离,即在写的时候,将底层的数组拷贝一份,然后修改拷贝的数组,再将修改后的数组通过原子操作的方式赋值给底层数组,以实现线程安全二、CopyOnWriteArrayList2-1 底层结构原创 2022-01-02 21:39:16 · 3139 阅读 · 0 评论 -
Lock公平锁与非公平锁的源码分析(以ReentrantLock为例)
一、类的结构简介Lock是一个接口,ReentrantLock则是这个接口的一个实现类,在ReentrantLock中有一个抽象内部类Sync,ReentrantLock中所有方法的实现均在这个抽象内部类中。而这个抽象内部类Sync又可以分为两个子类,分别为NonfairSync和FairSync。具体的结构图如下:在ReentrantLock的构造方法中,需要传入一个boolean型参数fair,内部类Sync将根据这个参数的值来创建对应的子类。 ...原创 2022-01-01 16:31:37 · 1095 阅读 · 0 评论 -
原子类Atomic
首先来看一段线程同步的代码:public class Example { private int a = 0; public synchronized void increment() { a++; } public synchronized void decrement() { a--; }}可以看到a++和a--均进行了同步操作。但是上面的代码换成这么写,性能会更好。public class AtomicExa原创 2021-12-26 11:28:11 · 381 阅读 · 0 评论 -
多线程部分
1.中断和线程阻塞1-1 阻塞首先需要说明的是,线程阻塞和中断并不是同一个概念,阻塞指的是要进入临界区的线程必须具备可以获得临界区资源的条件,才可以进入临界区,否则,需要在临界区外面阻塞等待。如上图,对于线程2和线程3,即为阻塞。1-2 进入阻塞的方式java中进入阻塞的方式有以下几种:1.Object,wait();//可传入一个long型参数,表示线程在一个特定的时间后会被唤醒,若不传,则永久阻塞,或需要由notify()来唤醒2.Thread.join();//可传入一原创 2021-12-25 21:37:42 · 458 阅读 · 0 评论 -
进程与线程——线程部分2
线程的调度算法可分为两大类:1.非抢占式算法。直到一个线程运行结束,才会选择下一个线程进行任务调度。若当前线程没有运行结束,需要等待。2.抢占式算法。一个线程只运行一段时间,如果超出这个时间,不管当前线程有没有运行完,系统都会把它挂起,然后选择另一个线程进行任务调度。近一步细分可分为以下6种:1.先来先服务算法这个算法的逻辑很简单,采用一个队列记录所有的任务,先进入队列的任务将最先被执行。但这种调度方法有一个明显的缺点,设想一个问题,如果一个任务量很大的作业先于好几个任务量.原创 2021-12-06 23:42:22 · 363 阅读 · 0 评论 -
进程与线程——线程部分1
1.线程的概念在早期的操作系统中都是以进程作为独⽴运⾏的基本单位,直到后⾯,计算机科学家们⼜提出了更⼩的能独⽴运⾏的基本单位,也就是线程。2.多线程模型如图所示,对于一个进程的多个线程,每个线程都具有自己独立内存空间,这样在每个线程从进程的共享内存中读取数据后,只能操作自己内存空间中的那一部分数据,这样就不会在多线程操作时产生冲突问题。3.多线程的优点和缺点1)优点:⼀个进程中可以同时存在多个线程;各个线程之间可以并发执⾏;各个线程之间可以共享地址空间和⽂件等资源;2)缺点:原创 2021-12-05 23:35:39 · 607 阅读 · 0 评论 -
进程和线程——进程部分
1.进程和线程的区别举个例子来说把,比如说你现在电脑上打开了QQ,微信,浏览器这三个应用。那么这三个应用,每一个就可以看做是一个进程。线程则可以看做是一个进程内部,有多个执行此程序的程序。而一个进程如果只用一个线程去执行的话,那么效率太低,系统的资源也没法利用。就好像同样是搬东西,两个人搬总比一个人搬要搬的快,这个多人搬东西的过程,就可以类比为多线程。进程是操作系统分配资源的基本单位,线程是操作系统调度的基本单位2.并发和并行的区别这个我认为是比较容易搞混的一点。借用小林图解里面的一副图来说原创 2021-12-05 21:29:15 · 922 阅读 · 0 评论 -
线程安全的实现方法
1.互斥同步互斥同步是一种常见也是最主要的并发正确性保障手段,同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被线程使用。互斥实现方式有互斥量,临界区,信号量等手段。JAVA里面最常见的互斥同步就是synchronized,synchronized关键字经javac编译后,会在同步块的前后形成monitorenter和monitorexit两个字节码指令。这两个字节码指令都需要一个明确的reference对象来解锁:对于static方法锁住的是class对象;对于非static方原创 2021-09-28 23:54:35 · 1365 阅读 · 0 评论 -
JAVA多线程的相关状态调用
一、JAVA多线程的实现多线程的实现主要以下三种模式:1.内核线程实现内核线程是指直接由操作系统内核支持的线程,这种线程由内核完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会直接使用内核线程吗,而是使用内核线程的一种高级接口,即轻量级线程,将轻量级线程与内核线程直接按照1:1的关系进行创建。具体的原理如图所示在这种模型下,每个轻量级进程都成为一个独立的调度单元,即使其中一个轻量级进程阻塞了,也不会影响整个进程仅需工作,但创建轻量.原创 2021-09-28 21:45:45 · 92 阅读 · 0 评论