并发编程
别停,
这个作者很懒,什么都没留下…
展开
-
IDEA debug ConcurrentLinkedQueue 的时候踩的坑
背景:最近,在复习JUC的时候调试了一把ConcurrentLinkedQueue的offer方法,意外的发现Idea在debug模式下竟然会 “自动修改” 已经创建的Java对象,当时觉得这个现象很是奇怪,现在把问题的原因以及解决过程记录下来,希望你在调试的时候不要踩坑。调试代码:调试的代码很简单,就是多次调用offer方法,然后观察ConcurrentLinkedQueue的head和tail属性。Queue<String> strings = new Concurrent原创 2020-05-25 13:35:58 · 2191 阅读 · 5 评论 -
并发编程中的锁
一、并发与并行1、并发:一个处理器同时处理多个任务,逻辑上的同时发生2、并行:多个处理器或者多核处理器同时处理不同的任务,物理上的同时发生并发是一个人同时吃三个馒头,并行是三个人同时吃三个馒头二、进程与线程进程是操作系统的结构基础,进程也是操作系统进行资源分配的独立单元;一个进程就是一个程序的运行,可将.exe程序看成是一个进程,进程中有很多的子任务,每个子任务对应一个线程,线...原创 2018-07-31 02:04:19 · 377 阅读 · 0 评论 -
ReentrantLock
一、与synchronized区别1、API层面:synchronized既可以修饰方法,也可以修饰代码块。 ReentrantLock方法内部、代码块内部使用。2、使用synchronized。如果Thread1不释放,Thread2将一直等待,不能被中断。使用ReentrantLock。如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。3、...原创 2018-07-31 21:13:17 · 271 阅读 · 0 评论 -
双重检查锁存在的问题
有时候可能需要推迟一些高开销的对象初始化操作,只有在使用这个对象的时候才去初始化。但是懒汉式的单例模式在多线程环境中是会出现问题的,可以使用synchronized来解决。package safe_singleton;public class SafeLazyInitialization { private static Instance instance; public ...原创 2018-08-01 00:37:40 · 797 阅读 · 0 评论 -
AbstractQueuedSynchronizer
AbstractQueuedSynchronizer一、简述1、AQS是用来构建锁或者其他同步组件的基础框架2、锁是面向使用者的,它定义了使用者与锁交互的接口(比如可以允许两个线程并行访问),隐藏了实现细节;同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。锁和同步器很好地隔离了使用者和实现者所需关注的领域。3、同步器的设计是基于...原创 2018-08-02 13:24:38 · 244 阅读 · 0 评论 -
volatile
提到volatile,立马涌现出三段很经典的代码,当然也会涉及到JMM第一点:可见性在JMM定义里面有一个主内存,堆内存栈内存什么的都可认为是主内存,每一个线程在执行过程之中,有一个线程自己的内存。实际上不能认为这块就是线程私有的内存,它也有可能是cpu上的缓冲区,这也被JMM称为是线程自己的内存,就是线程存放自己变量的内存。如果有两个cpu在运行两个不同的线程的时候,那么每个cpu上面都...原创 2018-08-03 00:14:45 · 371 阅读 · 0 评论 -
ThreadLocal内存泄漏
1、ThreadLocal解决的是变量在不同线程间的隔离性,可以理解为线程本地变量,当使用ThreadLocal维护变量的时候,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立的改变自己的副本而不会互相影响。2、ThreadLocal整体上给我的感觉就是,一个包装类。声明了这个类的对象之后,每个线程的数据其实还是在自己线程内部通过threadLocals...原创 2018-08-07 21:40:29 · 446 阅读 · 0 评论