![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java线程学习笔记
文章平均质量分 80
小猴子的技术笔记
这个作者很懒,什么都没留下…
展开
-
Callable、Future和FutureTask有什么关系?
欢迎微信搜索并关注“小猴子的技术笔记”公众号 私信我 领取丰富的视频学习资料! 开发业务中有很多用到线程的场景。遇到比较耗时的场景往往会起一个线程进行执行,如果不返回结果就可以直接new一个Thread对业务进行操作。因为runnable不会返回结果,也不会抛出异常,如果需要拿到返回值的话则需要使用Callable和Future或者Future Task进行结合。 这里可以简单理解为“Callable”表示产生结果和抛出异常。而“Future”是一个接口,表示异步计算结果 “原创 2021-04-27 08:57:50 · 201 阅读 · 0 评论 -
一个线程能否调用两次start()方法?
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,领取丰富面试资料和学习资料。 公众号回复“电子书”领取超多、超全电子书籍。 公众号回复“分布式”领取分布式学习视频。 我写了一个免费的图片压缩工具:“http://images.houry.top/index” 欢迎大家使用。 我写了一个netty弹幕系统:“http://bullet-screen.houry.top:8080/index”。 关于线程我的笔记中有专门的一栏在进行讲解,因此关于线程的一些概念今天原创 2021-03-12 08:55:04 · 1568 阅读 · 0 评论 -
AtomicStampedReference源码分析
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 之前的文章已经介绍过CAS的操作原理,它虽然能够保证数据的原子性,但还是会有一个ABA的问题。 那么什么是ABA的问题呢?假设有一个共享变量“num”,有个线程A在第一次进行修改的时候把num的值修改成了33。修改成功之后,紧接着又立刻把“num”的修改回了22。另外一个线程B再去修改这个值的时候并不能感知到这个值被修改过。 换句话说,别人把你账户里面的钱拿出来去投资,在你发现之前又给你还了回去,那原创 2021-01-25 08:51:04 · 689 阅读 · 1 评论 -
详细介绍Java线程的生命周期
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 一个线程由创建到死亡会经历自己的生命周期,我们可能会经常在博客中看到线程的“Running”状态,但是通过阅读Thread类的源码你又找不到“Running”状态,那么Java线程中到底有没有Running状态? 首先通过查看“Thread”给我们提供的源码可以看到,线程的生命周期会经过如下的状态(注意,同一时刻,一个线程只能处于其中的一种状态):public enum State { // 线程原创 2020-12-21 08:35:03 · 169 阅读 · 0 评论 -
深入详细了解synchronized底层原理
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 在多线程之间,共享变量的值是线程不安全的,因为线程在开始运行之后都会拥有自己的工作空间,而从自己工作空间把修改的值刷新回主存的时候需要CPU的调度。因此,一个线程看到的变量可能并不是最新的。 我们假设有个Share类中存放了一个共享的变量“count”。public class Share { public int count = 10000; public void decrement()原创 2020-12-15 08:52:58 · 408 阅读 · 1 评论 -
深入了解--线程中断 “interrupt()“,“isInterrupted()“和“interrupted()”-超详细介绍
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断。在日常开发中,经常使用中断标识来进行线程的安全终止。 Thread 给我们提供了三个有关中断的方法“interrupt()","isInterrupted()"和"interrupted()”。那么它们的具体功能到底是怎么样子的呢?下面就来一起研究下吧。 Thread类中的interrupt()不能中断在运行中的线程,原创 2020-12-12 11:23:53 · 554 阅读 · 1 评论 -
经典的面试题:DCL需不需要被volatile关键字修饰?为什么?
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 DCL(Double-Checked Locking)双重检查锁。在Java的多线程中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销,使用双重检查所是常见的延迟初始化的技术。但是,要正确使用线程安全的延迟初始化需要一些技巧,否则很容易出现问题。 首先来看看下面这段代码。下面的代码是一个典型的懒加载单例模式的实现,使用了延迟加载来降低同步的开销。请你猜一猜它会不会有线程安全的问题:public cl原创 2020-12-12 11:14:57 · 273 阅读 · 1 评论 -
图文带你了解volatile底层和内存屏障之间的关系
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 为了保证内存的可见性,Java编译器会在生成指令序列的适当位置插入内存屏障指令来禁止特定类型的处理器重排序。JMM被内存屏障指令分为了4类(Load表示读,store表示写): LoadLoad Barriers:在两个读指令之间插入一个“LoadLoad”的内存屏障,确保Load1的数据装载,先于Load2的数据装载。 StoreStore Barriers:在两个写指令之间插入一个“StoreS原创 2020-12-07 08:44:54 · 418 阅读 · 0 评论 -
详细解析Java内存,处理器,编译器重排序以及它对线程的影响
我们在编写程序的时候有一个编写代码的顺序,那么计算机执行的时候就是按照我们编写代码的顺序来执行的吗?答案是:不一定。如果两个代码之间没有依赖关系的话,那么编译器和处理器常常会对我们的编码指令重排序。重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,我们编写一个Java代码从源代码到最后的执行顺序如下:源代码:也就是我们用开发工具写的代码。编译器优化重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。指令级并行重排序:现代处理器采用了指令级并行技术来将多原创 2020-12-06 15:01:09 · 277 阅读 · 0 评论 -
Java内存模型JMM详解
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 在并发编程中,线程之间如何通信以及线程之间如何同步是需要处理的两个关键问题。线程通信指的是线程A和线程B之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递,下面就来简单介绍一下这两种机制。 在共享内存并发模型中,线程之间的通信是通过共享程序的公共状态,对公共状态进行写-读内存进行隐式通信,类似于下面这样: 在消息传递的并发模型中,线程之间没有公共状态,线程之间必原创 2020-12-06 14:50:06 · 209 阅读 · 0 评论 -
Java线程设置了优先级,就一定生效吗?Java线程的priority源码解析
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 我们知道在构建一个线程对象的时候可以给线程设置一个优先级,就像下面这样:public class MyRunnable implements Runnable { @Override public void run() { System.out.println("设置线程的优先级"); }}public class MyRunnableTest { public原创 2020-12-02 17:40:19 · 576 阅读 · 0 评论 -
Java Thread构造参数源码详细介绍
Thread类是一个构建线程的关键类,通过传递一个实现了Runnable接口的类就可以简单构造出一个线程对象,下面就来看看有关Thread类的一些基础知识点吧(本文略长请耐心阅读,相信你一定受益匪浅)。 Thread一共有8种(public修饰)构造函数和一种(default修饰)默认构造函数,分别如下所示:public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0);}public Thread(Runn原创 2020-11-30 22:13:55 · 276 阅读 · 0 评论 -
如何优雅地让线程休眠?Java sleep源码解析
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 在学习Java多线程的时候,经常会使用“sleep(long millis)”方法让线程休眠,其目的就是让当前线程休眠一段时间之后再继续执行后面的代码。我们来看看下面的代码:public class MyRunnable implements Runnable { @Override public void run() { long beginTime = System.curren原创 2020-11-28 23:12:38 · 2395 阅读 · 7 评论 -
什么是Java的守护线程?
欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。 守护线程是一种支持性线程,主要用于后台调度以及支持性的工作。守护线程具备自动结束生命周期的特性,而非守护线程则不具备。 如果对上面的概念一知半解的话,我们先来看一个简单的例子,明白守护线程的执行情况:public class MyDaemon implements Runnable { @Override public void run() { System.out.prin原创 2020-11-27 22:13:53 · 582 阅读 · 0 评论 -
Java中线程的run()方法和start()方法有什么区别?
由于Java是支持单继承的(接口除外),所以我们普遍启动线程的方式都是实现Runnable接口并重写run()方法。先来看下面一个简单的实例:public class MyRunnable implements Runnable { @Override public void run() { try { // 睡眠3秒 TimeUnit.SECONDS.sleep(3); } catch (Interr原创 2020-11-26 21:35:12 · 780 阅读 · 0 评论