java多线程
文章平均质量分 57
qq_37685457
这个作者很懒,什么都没留下…
展开
-
线程中捕获异常
总结:正常线程抛出异常时,在外部是捕捉不到的,当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。解决方案:为线程添加未捕获异常处理器(UncaughtExceptionHandler),实现UncaughtExceptionHandler接口,重写uncaughtException方法,在方法内捕获异常。案例:public class ExceptionThread2 implements Runnab原创 2021-06-22 13:44:54 · 659 阅读 · 1 评论 -
sleep、wait、yield、join
sleepsleep 方法是属于Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞线程,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会。waitwait 方法是属于 Object 类中的,wait过程中线程会释放对象锁,只有当其他线程调用 notify才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰...原创 2021-03-12 10:21:34 · 156 阅读 · 0 评论 -
多线程CAS
CAS只是一种思想,就是比较并替换。它有三个操作数:内存值V,旧的预期值A,要修改的新值B。只有当预期值A和内存值V相同的时候,才将内存值V修改为新值B,并返回ture。否则什么都不做,返回false。CAS一定要与volatile变量配合使用,这样才能保证线程每次拿到的变量都是主内存中最新的那个值,否则,旧的预期值A对某个线程来说,可能永远是一个不会变的值A。实现:Actomic原子类就是使...原创 2019-05-06 19:37:19 · 629 阅读 · 1 评论 -
多线程之间通信的七种方式
1、synchronized + wait + notifyAll + 条件2、Lock + Condition + 条件3、Semaphore4、CountDownLatch5、Cyclicbarrier6、Exchanger7、sleep、join、yeild以下是案例:线程通信一 之:synchronized + wait + notifyAll + 条件...原创 2019-05-01 16:28:03 · 2249 阅读 · 0 评论 -
深度解析:读写锁原理
对于多个线程共享同一个资源的时候,多个线程同时对共享资源做读操作是不会发生线程安全性问题的,但是一旦有一个线程对共享数据做写操作其他的线程再来读写共享资源的话,就会发生数据安全性问题,所以出现了读写锁ReentrantReadWriteLock。读写锁允许多个线程同时获取读锁,但有一个线程获取写锁之后其他线程都会进入等待队列进行等待。读写锁的写锁是一把独占锁,它与ReentrantLock的原...原创 2019-05-05 22:00:07 · 8734 阅读 · 0 评论 -
深度解析:AQS原理
AQS的全称是AbstractQueuedSynchrizeder(抽象队列同步器)。它是为实现依赖于先进先出等待队列的阻塞锁和各种同步器(Semaphore,CountdownLatch,CyclicBarrier,Exchanger等等)而提供的一种基础框架。 它内部有一个int类型的state变量,被volatile关键字修饰,保证线程之间的可见。还会维护一个Node内部类(用于生...原创 2019-04-30 11:12:55 · 6812 阅读 · 10 评论 -
深度解析:Condition实现原理
Condition指的就是ConditionObject,是AQS的一个内部类。ConditionObject的原理是基于AQS的Node内部类维护了两个队列,一个等待队列,一个同步队列;一个是单向队列,一个是双向队列。如果某个线程调用了await方法之后,就会使当前线程进入到等待状态,原理就是先获取当前线程的状态,然后生成一个Node节点,将当前节点加入到等待队列中。它会先判断等待队列是否存在头节点,如果没有头节点的话,就说明当前等待队列的链表为空,那么就会将当前的节点设置成头节点,为节点也指向这..原创 2019-04-30 09:37:48 · 519 阅读 · 0 评论 -
深度解析:Fork/Join框架
Fork/Join框架是一个用于并行执行任务的框架,它的出现是为了适应多核处理器时代,提高cpu的利用率。核心思想是把一个大任务分割成若干个小任务,汇总每个小任务的结果作为大任务的结果。Fork/Join框架要完成两件事:1、Fork(任务分割):就是将一个大任务分割成足够小的子任务。2、Join(执行任务并合并结果):分割的子任务会分别保存到双端队列里,然后几个启动线程会到这个双端队列里...原创 2019-05-04 22:09:31 · 264 阅读 · 1 评论 -
深度解析:多线程Future
Future其实是一种设计模式,它的核心思想:假如有一个方法f,它的计算过程是相当耗时的,显然直接获取结果是不明智的,因为需要等待它计算完才能返回。所以可以在调用方法f的时候让它返回一个Future,通过这个Future可以监控和控制方法f的计算过程。它有几个核心方法:get():获取返回值结果。cancel():取消方法的执行过程。isDown():判断方法是否执行完成。isCa...原创 2019-05-03 21:26:55 · 262 阅读 · 0 评论 -
深度解析:CountDownLatch、CyclicBarrier、Semaphore基本原理
CountDownLatch、CyclicBarrier、Semaphore都是基于AQS实现的同步组件。CountDownLatch原理:CountDownLatch初始化的时候需要指定一个初始值,调用了CountDownLatch的await方法的线程就会处于阻塞状态,会将阻塞的线程生成一个node节点放进AQS的同步队列中,每个线程在调用CountDownLatch的countDow...原创 2019-05-02 21:58:05 · 432 阅读 · 0 评论 -
最全创建线程的方式
1、继承Thread类package cn.skq.thread1;class ThreadTest extends Thread{ @Override public void run() { System.out.println("我是一个小线程"); }}public class Test { public static void main(String[] args...原创 2019-05-02 20:30:58 · 124 阅读 · 0 评论 -
实现线程安全的四种方式
首先说说什么是线程安全性问题,多个线程共享同一个全局变量或静态变量,多个线程同时读数据不会发生数据安全性问题,但是有一个线程对数据进行写的时候,再有其他的线程来读写共享数据就有可能发生线程安全性问题。线程安全性问题出现的三个必要条件:1、多线程环境下2、多个线程共享同一个资源3、对资源进行非原子性操作解决线程安全的四种方式:1、synchronized锁(偏向锁,轻量级锁,...原创 2019-05-01 23:05:36 · 10723 阅读 · 0 评论 -
深度解析:偏向锁、轻量级锁、重量级锁
在JDK1.5之后java官方对synchronized进行了加强,为其增加了偏向锁,轻量级锁,重量级锁。偏向锁:优点:减少无竞争且只有一个线程使用锁的情况下,使用轻量级锁产生的性能系消耗。偏向锁假定未来只有第一个申请锁的线程会使用锁,不会再有任何线程来申请锁。因此,只需要Mark Word中CAS记录ower,如果记录成功,则偏向锁获取成功,记录锁状态为偏向锁,以后,当前线程就等...原创 2019-05-01 22:41:40 · 190 阅读 · 0 评论 -
深度解析:Synchronized原理
说起synchronized的原理吧,必须要从jvm的内存结构说起。每一个对象在被创建出来的时候都会在堆中为其分配内存空间,每一个对象含有三个部分组成:对象头、实例数据、对齐填充,其中对象头又分为三部分:自身运行时数据、类型指针、数组长度(如果是一个数组对象的话)。其中自身运行时数据又被称为Mark Word,这个Mark Word中含有很多信息,例如:对象的哈希码,对象的分代年龄,GC标识,...原创 2019-05-01 22:06:58 · 150 阅读 · 0 评论