java并发编程
文章平均质量分 75
java并发编程
每一个不曾起舞的日子,都是对生命的辜负
这个作者很懒,什么都没留下…
展开
-
CPU的缓存一致性与volatile关键字
1. CPU缓存结构CPU 寄存器 一级缓存 二级缓存 三级缓存 内存缓存以缓存行为基本单位与内存交换数据,一个缓存行默认64byte2. CPU缓存一致性2.1 MESI协议MESI是指4个状态的首字母,每个cache line有4个状态,可以用2个bit表示:状态 描述 监听任务 M:修改 数据只存在本cache中,且和内存中的数据不一致。 缓存行必须时刻监听所有视图读该缓存行所对应的主存的操作,这些操作必须在缓存将该缓存行写回主存并将状态改为S状原创 2021-11-03 14:06:11 · 370 阅读 · 0 评论 -
Java之并发安全的集合
1. Hashtable键和值不能为空 初始容量为11,每次扩容的容量是上一次容量的二倍再加一 扩容后原先的元素不需要额外的二次hash 锁住整张表2. ConcurrentHashMap2.1 Java1.7版本中由segment数组,hashEntry数组和链表组成。 segment数组大小也代表了并发数量。而且segment的数组大小初始化后就不能更改。 懒惰初始化segment数组和segment[0]里面的HashEntry数组。 segment[i](i>0)原创 2021-10-09 19:45:33 · 202 阅读 · 0 评论 -
JAVA内存模型与线程安全
1. Java内存模型1.1 作用规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步地访问共享变量。主要时为了解决缓存一致性问题。1.2 主内存和工作内存所有共享变量都存储在主内存中 每个线程还有自己的工作内存,工作内存存储在高速缓存中或者寄存器中 工作内存中保存了该线程使用的变量的主内存拷贝的副本 线程只能操作工作内存中的变量,不同线程之间的变量值传递需要通过主内存来完成1.3 内存间交互操作java内存模型定义了8个操作来完成主内存和工作原创 2021-09-15 15:04:22 · 725 阅读 · 0 评论 -
ThreadLocal
1. 作用主要是用作数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,在多线程环境下,可以防止自己的变量被其他线程篡改2. 应用场景spring采用ThreadLocal,来保证单个线程中的数据库操作使用的是同一个数据库连接,同时,采用这种方式可以是业务层使用事务时不需要感知并管理connection对象,通过传播级别,巧妙地管理多个事务配置之间的切换,挂起和恢复。 在项目中一个线程经常遇到跨越若干方法调用,需要传递对象,即上下文信息,它是一种状态,经常时用户身份、任务信原创 2021-09-15 13:25:58 · 94 阅读 · 0 评论 -
Java对象头格式
Java对象头格式一个对象创建时如果开启了偏向锁(默认开启),那么创建对象后,markword最后三位为101,其他的位都为0(即thread,epoch,age都为0) 如果没有开启偏向锁,那么创建对象后,markword最后三位为001,其他位都为0(即hashcode、age都为0,第一次用到hashcode时才会复制) 轻量锁最后两位为00,还存放了锁记录地址 重量锁最后两位为10,还存放了Monitor地址...原创 2021-09-07 12:12:49 · 117 阅读 · 0 评论 -
java种线程的状态
1. 状态介绍1.1 new线程完成创建1.2 runnable调用了start()方法后就进入了runnable状态 涵盖了操作系统层面的 可运行状态、运行状态、阻塞状态(如BIO导致的线程阻塞)1.3 blocked因为无法获得锁而进入此状态1.4 waiting调用wait,park,join等方法都会进入该状态 调用wait方法会释放掉锁1.5 timed_waiting调用wait、sleep、park、join方法会进入该状态 调用sleep方法不会释放掉锁原创 2021-09-07 11:21:53 · 69 阅读 · 0 评论 -
ThreadPoolExecutor说明
1. 构造函数public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,原创 2021-09-06 21:43:51 · 80 阅读 · 0 评论 -
创建线程的三种方法
创建线程的三种方法1. 直接通过继承Thread类实现public static void main(String[] args) { Thread thread = new Thread() { public void run() { System.out.println("多线程要执行的代码"); } //这里面也就是多线程要执行的任务 }; thread.start();}这种方法线程与任务死死地绑定了在一起,而原创 2020-12-25 15:05:24 · 91 阅读 · 0 评论