Java 多线程
小李小李彬彬有礼
记录自己学习的一点一滴
展开
-
死锁
当线程进入对象的synchronized代码块时,就持有了对象的锁,直到线程执行完此代码块,或调用了wait方法才会释放资源。在持有锁的期间,其他线程不能进入该代码块。当线程相互持有对方所需要的资源时,双方均处于等待对方释放资源的状态,如果双方都不主动释放资源,那么就会出现死锁。用代码说话上图中主函数执行的时候会出现死锁现象,因为当第一个线程(简称T1)进入run()方法后,进入...原创 2019-04-02 15:47:08 · 153 阅读 · 0 评论 -
Java线程安全/并发编程三大特性
1、原子性保证一个操作或多个操作要么全部执行且在执行过程中没有任何打断、要么全部不执行(有点类似于事务的概念)例如A向B汇款1000元,那么就需要有两个操作,一个是A账户减1000元,另一个是B账户增加1000元,如果这个过程中任何一个操作出现故障,都是不符合规矩的也是不能保障汇款人和收款人的财产安全。换句话说,如果想要保证每次转账都不会造成双方任何一方的财产损失,我们必须要保证操作的原子...原创 2019-06-25 12:06:52 · 737 阅读 · 0 评论 -
Java如何捕获处理线程运行期间的非受检异常
我们在重写Thread的run()方法时,是被限制无法向上抛出异常的,而且java区分受检异常(checked exception)和非受检异常(unchecked exception),可能出现受检异常的代码,编译器会强制要求我们通过try/catch的方式进行异常处理。但是非受检异常不会被强制要求处理,如果我们想在线程里处理非受检异常,那么就需要使用Thread提供的UncaughtExcep...原创 2019-05-06 17:02:45 · 412 阅读 · 0 评论 -
模拟10个线程抓取数据,限制一次性最多有5个线程工作
package com.thread.demo.unit2;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.List;/** * @Author: Peacock__ * @Date: 2019/5/5 15:27 */public...原创 2019-05-05 16:02:16 · 653 阅读 · 0 评论 -
synchronized关键字
说在前面:文章内容为自己学在习过程中对知识的理解,如有不正确的之处,欢迎大家指正~~共同进步!!!在日常开发工作,很多情况会用到多线程,那么在多线程运行的环境下,就很难避免会涉及到一些共享数据。若出现多个线程同时访问操作同一共享数据的情况,可能会造成数据混乱的现象,破坏数据一致性。这个时候就要考虑使用“锁”来解决这一现象。“锁”见名知意,将某物锁起来,不让其他人用。那么在我们Java程序开发中...原创 2019-04-25 18:05:51 · 186 阅读 · 0 评论 -
sleep()与wait()的区别
1、sleep是Thread类的方法,wait是Object类的方法2、sleep不需要唤醒,wait需要唤醒3、sleep不会释放对象锁,wait会释放对象锁4、sleep不依赖monitor对象,而wait依赖monitor对象我觉得第1、2项没什么需要额外解释的了,我们通过代码验证一下第3、4项吧sleep不会释放对象锁,wait会释放对象锁1.sleep()...原创 2019-04-29 19:05:20 · 264 阅读 · 0 评论 -
结束线程的几种方式
我们知道Thread.stop方法已经被标记为过时方法了,因为使用stop会有很大一些问题。那么除了stop方法,我们还能用以下方法来实现结束线程功能1、维护一个线程是否结束的flag2、使用interrupt3、定义守护线程维护一个线程是否结束的flagpackage com.thread.demo;import java.util.concurrent.TimeUni...原创 2019-04-29 15:40:35 · 651 阅读 · 0 评论 -
【转】深入理解Java并发之synchronized实现原理
大牛总结的很到位、受益匪浅,感兴趣的小伙伴一起学习!!!!博客链接:https://blog.csdn.net/javazejian/article/details/72828483转载 2019-04-29 11:01:45 · 200 阅读 · 0 评论 -
synchronized关键字实现原理
上篇文章中已经学习了synchronized关键字的作用,以及使用方式,这篇来学习一下synchronized的底层实现原理。首先需要知道,synchronized对象锁的指针指向的是一个monitor对象(ObjectMonitor由C++实现的),每个对象都有对应的monitor,对象的monitor随对象的创建而创建,或随线程获取对象锁而创建,随销毁而销毁。我们需要关注的是ObjectM...原创 2019-04-28 17:42:51 · 247 阅读 · 0 评论 -
Thread中yield、join、sleep(0)区别
Thread.yield会让当前线程让出持有的锁,让包含自己在内的其他线程去争抢锁,自己依然有抢到锁的可能性。Thread.join会让调用当前线程的线程处于阻塞状态,直至当前线程执行完毕。Thread.sleep(0)只是短暂的休眠,并不会让出锁,依然是锁的持有者。...原创 2019-04-29 10:55:05 · 828 阅读 · 1 评论 -
Thread中的join()方法
Thread中的join()方法用来让调用线程等待当前线程执行完毕再执行测试代码:情景一:不调用join()public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(){ @Override p...原创 2019-04-22 15:35:21 · 1074 阅读 · 0 评论 -
守护线程(Daemon)
守护线程是程序运行时,后台提供的一种通用服务的线程。Java线程分为两种:用户线程(非守护线程)、守护线程用户线程和守护线程本质上没什么区别,唯一的区别在于JVM的退出,如果用户线程全部退出运行。不管是否存在守护线程,JVM都会退出,因为即使存在守护线程,他也没有可守护的用户线程了。垃圾回收线程是典型的守护线程,当JVM开始运行的时候,垃圾回收线程就一直在后台默默守护,对JVM执行过程中产...原创 2019-04-22 11:12:36 · 206 阅读 · 0 评论 -
线程生命周期、重要知识点
当我们通过Thread t1 = new Thread()创建一个线程的时候,其实这个时候t1不能代表一个线程(通过JConsole看不到这个线程),调用start()方法后,才会是一个真正的线程(通过JConsole可以看到这个线程)。New表示创建一个线程Start表示开启线程Runnable表示处于就绪状态,随时可以开始执行Running表示被分配到了CPU执行权后就具备了...原创 2019-04-22 10:28:39 · 182 阅读 · 0 评论 -
volatile关键字以及原理
volatile是在并发编程中保证共享数据一致性的常用关键字,同时也能保证多线程中共享数据的可见性、指令的有序性。我们知道,每个线程在执行时,都有自己独立的工作内存,用于存放线程执行时涉及到的一些变量,这些变量其实都是主存中相关变量的副本,在线程执行完毕后更新变量的值到主内存中。如果多个线程之间变量需要共享那么只能通过主内存来实现。例如A、B两个线程在执行的时候都涉及到了X变量,那么A...原创 2019-12-26 14:43:56 · 173 阅读 · 0 评论