并发编程的第二部分,先来谈谈发布(Publish)与逸出(Escape); 发布是指:对象能够在当前作用域之外的代码中使用,例如:将对象的引用传递到其他类的方法中,对象的引用保存在其他类可以访问的地方,或在某个非私有的方法中返回对象的引用; 逸出是指:发布内部状态可能会破坏封装性,如果在对象构造完成之前就发布该对象,就会破坏线程安全性; 下面结合一个例子来理解: class UnsafeStates { private String[] states = new String[] { "AA&q…
1. 多线程场景下尽量使用并发容器代替同步容器 (如ConcurrentHashMap代替同步且基于散列的Map, 遍历操作为主要操作的情况下用CopyOnWriteArrayList代替同步的List) ConcurrentHashMap:分段锁机制,多线程条件下优于HashMap+synchronized的组合方式: CopyOnWriteArrayList: 每次修改时都会创建并重新发布一个新的容器副本,从而实现可变性.容器的迭代器保留一个指向底层基础数组的引用,这个数组当前位于迭代器的起…
本文源码:GitHub·点这里 || GitEE·点这里 一.并发问题 多线程学习的时候,要面对的第一个复杂问题就是,并发模式下变量的访问,如果不理清楚内在流程和原因,经常会出现这样一个问题:线程处理后的变量值不是自己想要的,可能还会一脸懵的说:这不合逻辑吧? 1.成员变量访问 多个线程访问类的成员变量,可能会带来各种问题. public class AccessVar01 { public static void main(String[] args) { Var01Test var01Tes…
在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁.因此,对于更改集合内容的方法,没有一个是同步化的.集合本质上是非多线程安全的,当多个线程与集合交互时,为了使它多线程安全,必须采取额外的措施. 在Collections类 中有多个静态方法,它们可以获取通过同步方法封装非同步集合…
参考博客 Java多线程系列--"基础篇"04之 synchronized关键字 synchronized基本规则 第一条 当线程访问A对象的synchronized方法和同步块的时候,其他线程无法访问A对象的synchronized方法和同步块 第二条 当线程访问A对象的synchronized方法和同步块的时候,其他线程可以访问A对象的非synchronized方法和同步块 第三条 当线程访问A对象的synchronized方法和同步块的时候,其他线程不可以访问A对象其他synch…
从单线程应用转变为多线程应用并不只是带来好处.这种转变也会带来一定得开销得.并不是所有时候都要把你的应用编程多线程的.你应该明白这样做确实会带来好处,而且这种好处要比开销大.如果你不确定的话,要试着去度量应用的性能或响应,而不是靠猜. 更复杂的设计 虽然某些多线程程序在设计上确实要比单线程应用简单,但是其它情况却会变得更复杂.在多线程中执行访问共享数据的代码需要特别注意.线程交互从来都不是那么简单.因为不正确的线程同步导致的错误很难排查,重现和解决. 上下文切换开销 当一个CPU从一个正在执行的…
1.制作测试表 create table t1 as select * from FW_T_GTXLOG insert into t1 select * from t1; create table t2 compress as select * from t1 create table t3 as select * from t1 2.查看测试表数据量 select count(*) from t1; select count(*) from t2; select count(*) from t…
一.计算机内存模型 针对计算机机器而言,操作系统.JVM程序等其他所有程序都需要遵循内存模型规范.1.CPU技术发展1.1 CPU缓存的出现CPU的发展快于内存条,CPU的运算速度越来越快,内存条的读写速度无法适应CPU的速度,那么就在CPU和内存条之间加上高速缓存来适配: (1)缓存有L1-一级缓存.L2-二级缓存.L3-三级缓存等多级缓存; #查看核cpu0,index0的缓存大小 $ cat /sys/devices/system/cpu/cpu0/cache/index0/size 32…
一 前言 前面已经说到JUC中的锁主要是基于AQS实现,而AQS(AQS的内部结构 .AQS的设计与实现)在前面已经简单介绍过了.今天记录下JUC包下的锁是怎么基于AQS上实现的 二 同步锁 同步锁不是JUC中的锁但也顺便提下,它是由synchronized 关键字进行同步,实现对竞争资源互斥访问的锁. 同步锁的原理:对于每一个对象,有且仅有一个同步锁:不同的线程能共同访问该同步锁.在同一个时间点该同步锁能且只能被一个线程获取到,其他线程都得等待. 另外:synchronized是Java中的关…
这几天全国都是关键时候,放假了,还是要学习啊!很久没有写博客了,最近看了一本书,有关于java并发编程的,书名叫做“java并发编程之美”,讲的很有意思,这里就做一个笔记吧! 有需要openjdk8源码的,可以直接下载 链接:https://pan.baidu.com/s/1_uT99PLxH-STcs0zl0Mhuw  提取码:ov5b 一.了解并发和并行 并发:指的是同一时间段内多个任务在执行,并且没有执行结束:就好像你用一个手机看视频,你一下子想看熊出没,一下子又想看喜羊羊,那么你会怎么办…