![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程编程
文章平均质量分 95
本专栏将讲解各种多线程的知识,包括synchronized、Concurrent包等。包含各种实际问题以及面试常见的问题,帮你吃透多线程。
大脑补丁
怕什么真理无穷,进一寸有一寸的欢喜。
展开
-
Java中死锁之代码演示和检测
本文将通过Java代码演示一个死锁程序,并用JDK自带的工具`jstack`工具,来验证下是否真正的有死锁发生。明白了死锁发生的机制,我们可以想办法避免死锁发生,第一种方法是注意加锁顺序。第二种避免死锁的方式是,设置超时时间,如果超过一定时间,自动释放锁。在程序运行时,我们可以通过`jstack`工具,查看程序运行状态,是否有死锁。原创 2020-12-14 16:39:43 · 920 阅读 · 0 评论 -
Java线程属性详解
本节来介绍下Java中线程的属性,即线程的编号(ID)、名称(Name)、守护线程(Daemon)、优先级(Priority),讲解下这些属性各自的作用,以及开发中需要注意的事项。其实除了线程名称属性,其他属性在编码过程中,是无需人为指定的。线程的ID、优先级和守护线程更多的是用作只读属性使用,并不需要手动修改默认配置。原创 2020-11-14 11:54:16 · 592 阅读 · 0 评论 -
Java中yield()方法作用讲解
①.`yield()`方法只是提出申请释放CPU资源,至于能否成功释放由JVM决定。由于这个特性,一般编程中用不到此方法,但在很多并发工具包中,`yield()`方法被使用,如`AQS`、`ConcurrentHashMap`、`FutureTask`等。②.调用了`yield()`方法后,线程依然处于`RUNNABLE`状态,线程不会进入堵塞状态。原创 2020-11-08 15:41:25 · 12786 阅读 · 4 评论 -
Java中join()方法原理及使用教程
本节介绍了`join()`方法的使用方法,分析了`join()`方法的源码,并且找到了两种`join()`方法的等效替换方法,然后我们讲解了使用`join()`方法时,讲解了为什么要响应主线程的中断,维护好多线程的数据一致性,并给出了代码示例。希望通过本文,可以彻底吃透`join()`方法。原创 2020-11-07 16:51:57 · 38730 阅读 · 5 评论 -
Java中sleep()方法和wait()方法的异同点
①.`wait()`、`notify()`方法必须写在同步方法中,是为了防止死锁和永久等待,使线程更安全,而`sleep()`方法不需要有这个限制。②.`wait()`方法调用后会释放锁`sleep()`方法调用后不会释放锁。③.`sleep()`方法必须要指定时间参数;`wait()`方法可以指定时间参数。④.两个方法所属类不同,`sleep()`方法属于`Thread`类;`wait()`属于`Object`类中,放在`Object`类中是因为`Java`中每个类都可以是一把锁。原创 2020-11-07 12:00:49 · 5678 阅读 · 0 评论 -
Java如何正确停止线程(三种场景)
本文将讲解Java中三种场景下如何正确的停止线程,分别是普通情况、堵塞状态、循环中堵塞状态,三种情况下如何正确的停止线程。线程在三种场景下的停止方式,都是通过`interrupt()`方法来停止的,但特殊的是停止循环中的阻塞线程时,需要在循环外部增加`try-catch`代码块,捕获到中止堵塞状态异常时停止线程。原创 2020-11-01 15:53:35 · 2779 阅读 · 0 评论 -
Java线程状态完全解析教程
Java线程有6种状态,分别是`NEW`、`RUNNABLE`、`BLOCKED`、`WAITING`、`TIMED_WAITING`、`TERMINATED`。本文讲解线程状态变化的流程以及用代码演示通过调用哪些方法可以使线程改变状态。本文详细讲解了线程的6种状态各自的定义,以及从代码层面演示并分析了各种状态的含义,讲解了线程执行的流程以及注意事项。原创 2020-11-01 14:14:41 · 991 阅读 · 1 评论 -
设计模式之生产者消费者模式
本文通过`wait()`和`notify()`方法,实现和分析消费者和生产者模式,此模式优雅的实现了生产者和消费者的解耦,并且支持并发。通过手写一份生产者消费者模式的代码,进行讲解。学习领悟了这种设计模式,才可以真正理解`消息中间件`实现的底层思想,比如Kafka、RocketMQ、RabbitMQ等。原创 2020-10-31 17:06:45 · 2129 阅读 · 1 评论 -
Java两个线程交替打印奇偶数(两种方法对比)
我们将通过“两个线程交替打印100内的奇偶数”,来展示下`wait()`方法和`notify()`方法的用法和优点,当然要体现出优点,自然要通过对比不使用这两个方法实现同一功能的代码,通过这几篇文章的讲解,帮你彻底搞懂`wait()`方法和`notify()`方法的用法。原创 2020-10-31 15:11:20 · 15054 阅读 · 21 评论 -
Java多线程wait()和notify()系列方法使用教程(内涵故事)
本文讲解Java中`wait()`、`notify()`,通过一个标准的使用实例,来讨论下这两个方法的作用和使用时注意点,这两个方法被提取到顶级父类`Object`对象中,地位等同于`toString()`方法,所以本文带你从零开始搞懂它们的用法,在文章最后,准备了一个《捡肥皂》的故事,就算你没写过代码,读了此故事也能明白`wait()`、`notify()`系列方法在程序中的作用了,也算是在1024程序员节送给大家的彩蛋了。原创 2020-10-24 14:17:47 · 6413 阅读 · 16 评论 -
Java多线程中notifyAll()方法使用教程
1.`notifyAll()`中`All`的含义是所有的线程,而不是所有的锁,只能唤醒等待(调用wait()方法等待)同一个锁的所有线程,这一点一定要注意。2.`notifyAll()`必须在当前线程拥有监视器锁的情况下执行,否则将抛出异常`IllegalMonitorStateException`。意思是说必须在同步代码块中,调用此方法,否则可能出现在没有得到锁的情况下,执行了此方法,导致程序异常。`wait()`和`notify()`系列方法这样设计的目的是防止死锁或永久等待发生。原创 2020-10-27 22:33:11 · 17917 阅读 · 13 评论 -
Java中Synchronized的可重入性和不可中断性的分析和代码验证
简介本文介绍synchronized关键字的两个重要的性质可重入性和不可中断性,我们将用代码来实现和验证这两个性质。明白这种理论性质有什么用?明白了特性你才能懂得Synchronized的作用范围,使用的时候才不容易犯错。一.可重入性可重入性:同一个线程的外层函数获得锁后,内存函数可以直接获取该锁。举个生活中的可重入性的例子:当我们排队的时候,经常遇到有个别不文明的人,他们会让自己的好友直接插队在他的位置,而且有时还一次插队好几个。这就是一个人获得了优先权后,会让投靠他的所有人都获得该权利,原创 2020-05-28 09:54:51 · 1095 阅读 · 1 评论 -
Java多线程访问Synchronized同步方法的八种使用场景
简介本文将介绍8种同步方法的访问场景,我们来看看着八种情况下,多线程访问同步方法是否还是线程安全的。这些场景是多线程编程中经常遇到的,而且也是面试时高频被问到的问题,所以不管是理论还是实践,这些都是多线程场景必须要掌握的场景。七种使用场景:接下来,我们来通过代码实现,分别判断以下场景是不是线程安全的,以及原因是什么。两个线程同时访问同一个对象的同步方法两个线程同时访问两个对象的同步方法两个线程同时访问(一个或两个)对象的静态同步方法两个线程分别同时访问(一个或两个)对象的同步方法和非同步方法原创 2020-05-22 09:20:15 · 2494 阅读 · 1 评论 -
Java中synchronized实现类锁的两种方式及原理解析
简介上一篇文章《Java中synchronized实现对象锁的两种方式及原理解析》中,介绍了方法锁的两种实现方式及Synchronized的底层原理,本文将讲解synchronized的类锁的两种实现方式。一.类锁的定义什么是类锁类锁指synchronize修饰的静态方法或指定锁为class对象。类锁来自何处?不同的线程,访问使用类锁的方法的时候,他们获取到的“锁”,其实是Class对象。因为同一个类中有且只有一个Class对象,但同一个类中可以有很多个其他对象。此时,就出现了同一个类中多个对原创 2020-05-20 09:24:29 · 7634 阅读 · 2 评论 -
Java中synchronized实现对象锁的两种方式及原理解析
简介本文将介绍Java中两种对象锁及其实现方式。分别是同步代码块锁和方法锁。我们将解决上一篇文章《Java中线程安全和线程不安全解析和示例》中提到的线程不安全问题,看看通过synchronized的对象锁,怎样轻松解决该问题。一.同步代码块锁案例:通过同步代码块锁,实现两个线程对同一个全局变量count,各自执行1万次count++,验证结果是否等于2万,而不会出现小于2万的情况。完整代码实现:public class SynchronizeCodeBlockLock implements Run原创 2020-05-17 19:25:28 · 7463 阅读 · 0 评论 -
Java官方文档创建线程的两种方式及优点和缺点分析
根据Oracle提供的JAVA官方文档的说明,Java创建线程的方法只有两种方式,即集成`Thread`类和实现`Runnable`接口。其他所有创建线程的方式,底层都是使用这两种方式中的一种实现的,比如通过线程池、通过匿名类、通过`lambda`表达式、通过`Callable<V>`接口等等,全是通过这两种方式中的一种实现的。所以我们在掌握线程创建的时候,必须要掌握的只有这两种,通过文章中优缺点的分析,这两种方法中,最为推荐的就是实现`Runnable`接口的方式去创建线程。原创 2017-06-26 14:17:19 · 967 阅读 · 0 评论 -
Java中线程安全和线程不安全解析和示例
本文作为多线程编程的第一篇文章,将从一个简单的例子开始,带你真正从代码层次理解什么是线程不安全,以及为什么会出现线程不安全的情况。文章中将提供一个完整的线程不安全示例,希望你可以跟随文章,自己真正动手运行一下此程序,体会一下多线程编程中必须要考虑的线程安全问题。原创 2020-05-16 19:38:25 · 5509 阅读 · 3 评论