多线程
Java 多线程
X_信仰
向着大神之路进阶的小白
展开
-
Java 阻塞队列
BlockingQueue在阻塞队列中线程阻塞有两种情况:1、当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列。2、当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。阻塞队列对插入、移除、获取元素操作提供了四种不同的方法用于不同的场景中使用:1、抛出异常;2、返回特殊值(null 或 fals...原创 2020-03-16 22:01:01 · 269 阅读 · 0 评论 -
AQS
AQS(抽象队列同步器)AbstractQueuedSynchronizer 类如其名,抽象的队列式的同步器,AQS 定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的 ReentrantLock/Semaphore/CountDownLatch。AQS 中主要的成员变量:// 等待队列头结点,可以把它看成是当前持有锁的线程// 懒加载private tran...原创 2020-03-14 20:25:03 · 177 阅读 · 0 评论 -
volatile 关键字
Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。volatile 变量具备两种特性,volatile 变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取 volatile 类型的变量时总会返回最新写入的值。volatile 作用变量可见性其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么...原创 2020-03-12 17:17:44 · 79 阅读 · 0 评论 -
线程池原理
文章目录ThreadPoolExecutor线程池的组成线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。ThreadPoolExecutorThreadPoolExecutor 的构造方法如下:...原创 2020-03-12 17:00:05 · 222 阅读 · 0 评论 -
同步锁与死锁
同步锁当多个线程同时访问同一个数据时,很容易出现问题。为了避免这种情况出现,我们要保证线程同步互斥,就是指并发执行的多个线程,在同一时间内只允许一个线程访问共享数据。 Java 中可以使用 synchronized 关键字来取得一个对象的同步锁。死锁何为死锁,就是多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。例如下面的代码,两人互相抱着对方需要的资源,互不退让,造成死锁。...原创 2020-03-10 22:19:41 · 999 阅读 · 0 评论 -
锁优化
减少锁持有时间只用在有线程安全要求的程序上加锁减小锁粒度将大对象(这个对象可能会被很多线程访问),拆成小对象,大大增加并行度,降低锁竞争。降低了锁的竞争,偏向锁,轻量级锁成功率才会提高。最最典型的减小锁粒度的案例就是ConcurrentHashMap。锁分离最常见的锁分离就是读写锁 ReadWriteLock,根据功能进行分离成读锁和写锁,这样读读不互斥,读写互斥,写写互斥,即保证...原创 2020-03-10 22:01:03 · 126 阅读 · 0 评论 -
CyclicBarrier、CountDownLatch、Semaphore 的用法
Semaphore 信号量Semaphore 是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore 可以用来构建一些对象池,资源池之类的,比如数据库连接池。测试代码,用法如下:package Thread;import java.util.concurrent.Semaphore;...原创 2020-03-10 18:04:58 · 167 阅读 · 0 评论 -
ReentrantLock 的使用 以及与 synchronized 的区别
文章目录公平锁非公平锁ReentrantLock 的基本使用中断 轮询 lockInterruptibly tryLockReentrantLock 与 synchronizedCondition 类和 Object 类锁方法区别区别公平锁公平锁指的是锁的分配机制是公平的,通常先对锁提出获取请求的线程会先被分配到锁,ReentrantLock 在构造函数中提供了是否公平锁的初始化方式来定义公平...原创 2020-03-10 17:51:57 · 185 阅读 · 0 评论 -
Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)
重量级锁(Mutex Lock)Synchronized 是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的 Mutex Lock 来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么 Synchronized 效率低的原因。因此,这种依赖于操作系统 Mutex L...原创 2020-03-10 12:39:00 · 1536 阅读 · 0 评论 -
当调用 notify 时发生 IllegalMonitorStateException
下面这个代码是测试 wait 与 notify 方法的用法,在新创建出来的线程中调用 wait 方法阻塞当前线程,并释放锁资源,在主线程中调用 notify 方法唤醒阻塞的线程时,发生 IllegalMonitorStateException 异常。package Thread;public class WaitNotifyDemo implements Runnable { pr...原创 2020-03-09 19:05:14 · 740 阅读 · 0 评论 -
synchronized 关键字
互斥锁的特性互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程的协调机制,这样在同一时间只有一个线程对需要同步的代码块进行访问。互斥性也称为操作的原子性。可见性:必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作,从而引起不一致。对于 Java...原创 2020-03-09 18:09:48 · 107 阅读 · 0 评论 -
乐观锁与悲观锁、自旋锁
乐观锁乐观锁是一种乐观的思想,即认为读多写少,遇到并发的可能性低,每次拿数据时都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CAS 算法实现。Java 中的乐观锁基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。悲观锁悲观锁就是悲观的思想,即认为写多,遇到并...原创 2020-03-09 12:46:46 · 4526 阅读 · 0 评论 -
Java 守护线程
在 Java 中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)定义:守护线程——也称“服务线程”,它是后台线程,它有一个特性,即为用户线程提供公共服务,在没有用户线程可服务时会自动离开。优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。设置:通过 setDaemon(true) 来设置线程为“守护线程”,必须在 thre...原创 2020-03-06 21:57:30 · 1058 阅读 · 0 评论 -
终止线程的 4 种方式(interrupt)
正常运行结束程序运行结束,线程自动结束。使用标志位一般 run() 方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如:最直接的方法就是设一个 boolean 类型的标志,并通过设置这个标志为 true 或 false 来控制 while 循环是否退出,代码示例:public cl...原创 2020-03-06 21:34:00 · 1101 阅读 · 0 评论 -
notify 和 notifyAll 的区别,锁池与等待池
锁池与等待池对于JVM 中运行程序的每个对象来说都有两个池:锁池 EntryList、等待池 WaitSet,而这两个池又与 Object 类中的 wait()、notify()、notifyAll() 三个方法以及 synchronized 关键字有关。锁池 EntryList假设线程 A 已经拥有了某个对象(不是类)的锁,而其它线程 B、C 想要调用这个对象的某个 synchroni...原创 2020-03-06 18:59:14 · 997 阅读 · 0 评论 -
sleep 和 wait 的区别
基本差别sleep 是 Thread 类的方法,wait 是 Object 类中定义的方法sleep() 方法可以在任何地方使用wait() 方法只能在 synchronized 方法或 synchronized 块中使用最主要的本质区别Thread.sleep 只会让出 CPU,不会导致锁行为的改变Object.wait 不仅让出 CPU,还会释放已经占有的同步资源锁...原创 2020-03-06 18:51:21 · 111 阅读 · 0 评论 -
Java 中线程的 6 种状态
Java 中线程的 6 种状态新建(New)新建状态,当程序使用 new 关键字创建了一个线程但还没有调用 start 方法,此时该线程处于新建状态,此时仅由 JVM 为其分配内存,并初始化其成员变量的值。运行(Runnable)运行状态,运行状态包含了操作系统中的两种子状态:Ready 和 Running。也就是说,处于 Runnable 状态中的线程可能正在执行,也可能正处于就绪状态...原创 2020-03-06 17:31:16 · 149 阅读 · 0 评论 -
线程创建的三种方式
继承 Thread 类public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } public static void main(String[] args){ MyThread myThread1 = new MyThread(); // 创...原创 2020-03-06 15:57:10 · 81 阅读 · 0 评论