并发JUC
文章平均质量分 77
yang_154116
这个作者很懒,什么都没留下…
展开
-
volatile
一、变量自身具有下列特性。可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。 volatile变量的写-读可以实现线程之间的通信。 从内存语义的角度来说,volatile的写-读与锁的释放-获取有相同的内存效果:vola...原创 2018-07-23 13:00:08 · 153 阅读 · 0 评论 -
从LongAdder看更高效的无锁实现
原文链接:https://blog.csdn.net/baidu_33116785/article/details/52276307LongAdder确实用了很多心思减少并发量,并且,每一步都是在”没有更好的办法“的时候才会选择更大开销的操作,从而尽可能的用最最简单的办法去完成操作。追求简单,但是绝对不粗暴。接触到AtomicLong的原因是在看guava的LoadingCache相关代码...转载 2018-07-22 07:47:17 · 186 阅读 · 0 评论 -
CAS的ABA问题及解决方法
一、什么是ABA问题?考虑如下操作: 并发1(上):获取出数据的初始值是A,后续计划实施CAS乐观锁,期望数据仍是A的时候,修改才能成功 并发2:将数据修改成B 并发3:将数据修改回A 并发1(下):CAS乐观锁,检测发现初始值还是A,进行数据修改 上述并发环境下,并发1在修改数据时,虽然还是A,但已经不是初始条件的A了,中间发生了A变B,B又变A...原创 2018-07-21 22:30:06 · 8727 阅读 · 1 评论 -
深入理解ThreadLocal
来自一个学长大佬的分享,在此谢谢学长。JavaSE Thread JUC前言以前虽然也接触过ThreadLocal,但是每当细问它的实现原理时,总是有一些地方说不清,归根到底还是对ThreadLocal的理解不够深入,只是停留在表面,今天就来总结一下ThreadLocal。接下来的源码分析会用到,所以先放在前面温故一下。简述java.lang.ThreadLocal可用来存放...转载 2018-07-19 23:04:25 · 132 阅读 · 0 评论 -
Java并发编程基础
Java并发编程基础4.1 线程简介4.1.1 什么是线程?现代操作系统调度的最小单元是线程,也叫轻量级进程(LightWeight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。4.1.2 为什么要使用多线程?(1)更多的处...原创 2018-07-25 09:57:52 · 118 阅读 · 0 评论 -
JUC之Future/Task框架
引入了一个"执行服务"的概念,它将"任务的提交"和"任务的执行"相分离,"执行服务"封装了任务执行的细节,对于任务提交者而言,它可以关注于任务本身,如提交任务、获取结果、取消任务,而不需要关注任务执行的细节,如线程创建、任务调度、线程关闭等。基本接口任务执行服务涉及的基本接口:Runnable和Callable:表示要执行的异步任务Executor和ExecutorServic...原创 2018-07-18 22:06:42 · 493 阅读 · 0 评论 -
线程池(JUC)
什么是池?例子----->买火车票、医院挂号数据库连接池常量池线程池基本概念线程池,就是一个线程的池子,里面有若干线程,它们的目的就是执行提交给线程池的任务,执行完一个任务后不会退出,而是继续等待或执行新任务。--->JDK1.5优点它可以重用线程,避免线程创建的开销在任务过多时,通过排队避免创建过多线程,减少系统资源消耗和竞争,确保任务有序完成ThreadPo...原创 2018-07-19 12:39:55 · 192 阅读 · 0 评论 -
Synchonized原理
总述:先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下3种形式。·对于普通同步方法,锁是当前实例对象。 ·对于静态同步方法,锁是当前类的Class对象。 ·对于同步方法块,锁是Synchonized括号里配置的对象一、从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法...原创 2018-07-23 19:51:37 · 672 阅读 · 0 评论 -
单例与双重检查锁
双重检查锁定与延迟初始化在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两种线程安全的延迟初始化方案。下面是非线程安全的延迟初始化对象的示例代码public class UnsafeLazyInitialization {private stati...原创 2018-07-23 19:30:29 · 224 阅读 · 0 评论 -
线程池
我们可以通过ThreadPoolExecutor来创建一个线程池。new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,milliseconds,runnableTaskQueue, handler); 通过下图理解参数 工作线程实现核心方法 public void run() {try {Runna...原创 2018-08-12 01:09:28 · 364 阅读 · 0 评论