![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程笔记
文章平均质量分 84
西红柿丶番茄
这个作者很懒,什么都没留下…
展开
-
线程私有:ThreadLocal
不知道大家有没有接触过ThreadLocal这个类,我还清楚的记得,自己当初第一次使用到这个类是缓存用户信息。刚开始学习java时,那个时候并没有想到什么分布式啊,单点登录(SSO),就使用ThreadLocal来保存用户一些全局信息,获取非常方便。那时,我只知道它是线程隔离的,非常好用,渐渐的,当它的身影出现越多的时候,对它的了解也就加深了一点,现在就让我们来领略一下ThreadLocal的魅力...原创 2019-01-09 23:47:33 · 507 阅读 · 0 评论 -
并发容器(二)—线程安全的List
不积跬步,无以至千里; 不积小流,无以成江海。 ...原创 2019-01-07 21:15:12 · 47308 阅读 · 4 评论 -
并发容器(一)—线程安全的Map
相信大家都使用过HashMap、ArrayList等数据结构,在非并发的情况下,它们都能很好的工作,但是一到并发环境,就可能出现各种各样的问题。这是为什么呢?当然,它们是非线程安全的,大家都知道。为什么它们是线程不安全的呢?在并发环境中,我们应该使用什么容器呢?在这里先以HashMap简单介绍。并发下的HashMap在并发环境中,我们来看看使用同一个HashMap会出现什么问题呢?示例如下...原创 2019-01-06 21:19:37 · 1662 阅读 · 1 评论 -
线程池-Executors
在实际项目中,大家或多或少都会遇到多线程设计问题。这是为什么呢?为了尽可能提高系统的吞吐量和性能。创建和使用线程非常简单,这也就导致很多项目在各种任务中频繁的创建线程,虽然与进程相比,线程是一种轻量级工具,但是创建和销毁都需要花费时间,太过于频繁,也会耗尽CPU和内存资源。大量的使用线程,如果导致系统出现OOM,这就违反我们的初衷了。使用线程,我们要有一个度,真实环境中,应该对线程加以控...原创 2018-12-22 21:18:53 · 896 阅读 · 0 评论 -
线程间通信
在日常开发中,多线程之间通常会进行相互协作完成任务。为了支持线程间通信,JDK提供了很多很有趣的方法,其中很普遍的就是等待/通知机制。JDK中使用等待wait()方法和通知notify()/notifyAll()实现,这两个方法不是线程内部所有,而是属于Object。等待/通知机制—第一种方式:public final void wait() throws InterruptedExcep...原创 2018-08-22 22:30:30 · 136 阅读 · 0 评论 -
浅谈线程安全与sychronized
使用多线程处理相关业务,在一定程度上能够获得更高的执行效率,提高程序性能,但是,如果我们在写多线程程序时,不加强注意,容易出现数据不一致性,也就是我们常说的 "线程安全" 问题。线程安全是我们在设计多线程程序时必须保证的一点,如果我们写出的程序数据正确性不能得到保证,即使程序性能得到提高,也是毫无意义的。非线程安全在什么时候会出现呢?当多个线程对同一对象实例进行并发访问时,可能得到错误的结...原创 2018-07-22 23:25:46 · 217 阅读 · 0 评论 -
线程是什么
在介绍线程之前,我们就不得不想到一个词 "进程"。关于进程,我相信大家都有所了解。经常在面试的时候,面试官或多或少都会问到进程与线程的区别。 下面,我们就来了解"进程"这个概念: 引用百度百科上的介绍:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。大家或许不是很理解这句...原创 2018-07-21 22:29:00 · 1918 阅读 · 0 评论 -
Lock的学习与使用
多线程是复杂的,为了使开发者写出简单、安全的并发程序,JDK提供了大量的API和框架。在上一节,大家已经认识了线程间同步的一个重要手段sychronized,现在,我们来学习一下JDK1.5新增的线程同步工具类Lock。Lock不仅具有sychronized的所有特性,在它的基础上,增加了许多其它的功能,相较于sychronized,Lock更加灵活。当然,我们不是说sychroni...原创 2018-07-29 23:08:20 · 502 阅读 · 0 评论 -
JAVA内存模型—JMM
在今天和明天之间,有一段很长的时间;趁你还有精神的时候,学习迅速地办事。 —— 歌德 在介绍java内存模型之前,先提出一个问题,如何保证一个线程看到的数据是正确的?大家可能认为这个问题很没有意思,很简单,在一个线程里,程序都是串行化执行的,你读取到的数据肯定是正确的。现在,我们讨论的是多线程,在多线程里,数据的一致性就变得比较复杂了。 JAVA虚拟机规范定义了一...原创 2018-07-09 22:24:53 · 132 阅读 · 0 评论 -
阻塞和非阻塞
在介绍阻塞和非阻塞之前,我们先来了解一下多线程间一个重要的概念——临界区。临界区——一种公有的资源或者共享数据,它可以被多个线程使用。临界区资源一次只能被一个线程使用,其它线程必须等待上一个线程执行完成之后,才能使用。临界区资源是多线程之间重要保护对象,当临界区资源同时被多个线程访问时,容易出现错误。代码示例:/** * @author php * @date 2018/7/2 */pub...原创 2018-07-02 23:10:16 · 11278 阅读 · 6 评论 -
同步和异步
同步和异步通常用来形容方法的调用方式。同步方法表明调用一旦开始,调用者必须等待方法执行完成,才能继续执行后续方法。异步方法表明,方法一旦开始,立即返回,调用者无需等待其中方法执行完成,就可以继续执行后续方法。通常我们写的方法都是同步方法,方法间执行都是串行化的,在一个线程内运行。我们举一个小例子:你和朋友去吃饭,你们到达饭店,点了一桌满汉全席。由于你们饿的不行,就在饭店等待厨师做好菜,等菜上桌。你...原创 2018-07-01 22:50:18 · 35684 阅读 · 4 评论 -
死锁
死锁,多么可怕的一个词,当生产环境出现此问题时,不仅问题难以排查,而且消耗极大的人力。或许大家会说,怎么可能引起死锁,整个项目我都不涉及多线程,你牛逼,走开,哈哈。大家或许想到了,我们可以使用无锁的方式解决啊,可以,无锁确实可以根除死锁问题,但是当业务逻辑复杂,无锁方式难度太大,我们或许会更加偏向于加锁。现在问题来了,有锁就可能产生死锁。定义死锁就是指两个或多个线程执行过程中,相互占用对方...原创 2019-01-16 23:05:28 · 170 阅读 · 0 评论