
java-多线程
还叫康师傅
这个作者很懒,什么都没留下…
展开
-
锁分类
锁分类加锁方式synchronized和lock的方式。两者的区别的话:synchronized是jvm层面的,锁的释放在代码块执行完成后,自动释放Lock加锁解锁是在代码层面实现的,都需要手动的实现,否则会出现死锁的情况。所以锁的释放一定要放在finally块中,避免锁一直占用资源Lock提供了很多的方法,比如查看线程是否获得了锁,tryLock()尝试获取锁等,操作起来比synchronized更加的灵活。ReenTrantLock,readLock,writeLock以上三种分别对原创 2020-09-01 20:45:11 · 283 阅读 · 1 评论 -
ThreadLocal
本篇博客实在自己看了JUC视频及嗷丙的博客后编写。具体的一些地方可能写的不太清晰。详情参考嗷丙知乎 ThreadLocal讲解嗷丙-ThreadLocal1.用途一:线程隔离,使一个线程单独享有一个变量,从而不加锁便可以保证线程安全。如经典场景:格式化日期,要想保证线程安全,第一种方式是加锁,但是若是线程数量多的话,锁竞争会变得很大。第二种便是为每个线程创建一个SimpleDateFormat对象,但是这样的话,若是线程有一千个,就需要创建一千个SimpleDateFormat对象,简单但太粗暴。原创 2020-08-30 22:45:55 · 341 阅读 · 0 评论 -
Java 线程的生命周期
通用的生命周期可以用如下图所示的 “五态模式” 来描述,分别为:初始状态、可运行状态、运行状态、休眠状态、终止状态。 初始状态:线程被创建,但是还不允许分配 CPU 执行,属于编程语言特有,仅仅是在编程语言创建,操作系统层面还没有。 可运行状态:可以分配 CPU 执行,操作系统也创建了线程。 运行状态:可运行状态的线程获取到 CPU 时间分片就转换成了运行状态。 休眠状态:运行状态的 线程调用了一个阻塞的 API 或者等待某个事件,就会转换成休眠状态,同时会释放原创 2020-05-19 12:30:00 · 1379 阅读 · 0 评论 -
Lock锁
Lock简单使用在java多线程中,锁的机制可以通过synchronized来实现,但在jdk1.5中新增加了ReentrantLock类也能达到同样的效果。下面通过一段代码来展示。package demo_20;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;...原创 2020-04-06 12:55:52 · 293 阅读 · 0 评论 -
线程可见性,Volatile关键字了解
再说线程可见性之前,先来说一下主内存和本地内存的关系,两者是造成线程可见性的关键原因1. 主内存和本地内存JMM有以下规定:所有的全局变量都存储在主内存中,同时每个线程也有自己独立的工作内存,工作内存中的变量内容是主内存中的拷贝线程不能直接读写主内存中的变量,而是只能操作自己工作内存中的变量,然后再同步到主内存中主内存是多个线程共享的,但线程间不共享工作内存,如果线程间需要通信,必须借...原创 2020-04-02 21:17:27 · 490 阅读 · 1 评论 -
多线程的常见面试题
1.线程连续两次调用start()方法所产生的情况public class TestMain { public static void main(String[] args) throws Exception { Thread thread = new Thread(new Runnable() { @Override p...原创 2020-03-30 00:15:00 · 489 阅读 · 0 评论 -
线程的异常处理
如下代码public class ExceptionThread { public static void main(String[] args) throws InterruptedException { try { new Thread(new ThreadException()).start(); Thread.sl...原创 2020-03-27 13:52:14 · 233 阅读 · 0 评论 -
线程间的通信及等待之wait()与notify() | notifyAll() 与 join()方法
总结1:wait()方法1:在调用此方法之前,线程必须获得该对象的对象级别的锁,及只能在同步方法或同步代码块中使用。2: 调用此方法后线程将从运行状态进入阻塞队列,同时释放对象锁(与sleep()不同)。直到该对象调用notify() | notifyAll() 后该线程才能够拥有重新竞争锁的机会。若线程处于wait状态时执行了interrupt()方法,线程会抛出 Interrupte...原创 2020-03-25 16:23:41 · 380 阅读 · 0 评论 -
线程的状态与生命周期及sleep与wait的区别
1. 线程的声明周期JDK中用Thread.State枚举表示了线程的几种状态 public enum State { NEW,//新建,还未启动(新建) RUNNABLE,//正在jvm中运行,但是可能正在等待操作系统的其他资源(运行) BLOCKED,//受阻塞,并且正在等待监视器锁(阻塞) WAITING,//处于等待状态...原创 2020-03-25 10:38:07 · 435 阅读 · 0 评论 -
线程中断的方式 interrupt与volatile
Thread.stop()方法此方法虽然可以立即停止线程,但是是不安全的方法。已被废弃。如果强制使用此方法停止线程,可能会使一些清理工作得不到完成。另外一个情况就是对锁的对象进行了解锁,导致数据得不到同步的问题。interrupt()方法调用此方法会在当前线程中打一个停止的标记,并不会真正的停止线程。要想真正的停止线程,还需要结合interrupted()或isInterrupte...原创 2020-03-20 21:57:21 · 628 阅读 · 0 评论