自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

城南孔乙己的专栏

专注Java服务端技术学习研究

  • 博客(19)
  • 收藏
  • 关注

原创 多线程基础——ThreadLocal

概念/** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently initialized * copy of the var

2022-02-22 17:02:45 530

原创 多线程安全——AQS

概念AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。如常用的 ReentrantLock/Semaphore/CountDownLatch都是依赖于它。参考文献https://segmen

2022-02-16 17:16:22 3010

原创 多线程安全——JUC工具汇总

LongAdderJDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈————AtomicLong 具有更好的性能,代价是消耗更多的内存空间:转存失败重新上传取消...

2022-02-14 11:19:49 3251

原创 多线程安全——CAS

概念在计算机科学中,比较和交换(Compare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成。算法过程CAS(Compare And Swap/Set)

2022-02-10 21:51:07 1343

原创 多线程安全——Lock和ReadWriteLock

概念(1)Lock和ReadWriteLock是两大锁的根接口,Lock代表实现类是ReentrantLock(可重入锁),ReadWriteLock(读写锁)的代表实现类是ReentrantReadWriteLock。Lock 接口支持那些语义不同(重入、公平等)的锁规则,可以在非阻塞式结构的上下文(包括 hand-over-hand 和锁重排算法)中使用这些规则。主要的实现是 ReentrantLock。ReadWriteLock 接口以类似方式定义了一些读取者可以共享而写入者独占的锁。此包

2022-01-28 17:53:56 2709

原创 多线程三大特性——原子性

概念原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行。原子性就是指该操作是不可再分的。如果一个操作是原子性的,那么多线程并发的情况下,就不会出现变量被修改的情况。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么说这个操作是原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要使用同步技术(sychronized)来让它变成一个原

2022-01-14 15:08:08 5120

原创 多线程安全——volatile解析

概念Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。特性一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:保证了不同线程对这个变量进行操作时的可见性,即一个线程

2022-01-10 20:30:09 2243

原创 多线程三大特性——重排序

Java语言规范JVM线程内部维持顺序化语义,即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执行顺序可以与代码逻辑顺序不一致,这个过程就叫做指令的重排序。指令重排序的意义:在Java中,JVM能够根据处理器特性(CPU多级缓存系统、多核处理器等)适当对机器指令进行重排序,最大限度发挥机器性能。

2022-01-07 19:00:00 1787

原创 多线程基础——内存屏障

内存屏障内存屏障(memory barrier)是一种概念。编译器和CPU可以在保证输出结果一样的情况下对指令重排序,使性能得到优化。插入一个内存屏障,相当于告诉CPU和编译器先于这个命令的必须先执行,后于这个命令的必须后执行。内存屏障另一个作用是强制更新一次不同CPU的缓存。例如:一个写屏障会把这个屏障前写入的数据刷新到缓存,这样任何试图读取该数据的线程将得到最新值,而不用考虑到底是被哪个cpu核心或者哪颗CPU执行的。内存屏障正是通过阻止屏障两边的指令重排序来避免编译器和硬件的不正确优化而

2022-01-07 18:54:41 1026

原创 多线程基础——缓存一致性

CPU缓存CPU的时钟频率非常的快,以至于运行效率与读写内存的效率存在着巨大的鸿沟,在读写内存过程中带来的等待浪费了很大的CPU算力。所以缓存的出现,是为了缓解CPU和内存之间速度的不匹配问题(cpu -> cache -> memory)。时钟周期:CPU完成一个基本动作需要的时间周期。向内存中写入数据,据权威资料,需要107个CPU时钟周期,即CPU的运行效率是写内存的107倍。如果CPU只执行写操作需要一个时钟周期,那CPU等待这个写完成需要等待106个时钟周期。CPU

2022-01-05 20:15:45 1647

原创 多线程三大特性——可见性

JMM可见性问题在多线程应用程序中,线程对非易失性变量(non-volatile variables)进行操作,出于性能原因,每个线程在处理变量时会将变量从主内存复制到CPU缓存中。如果您的计算机包含多个CPU,每个线程可能运行在不同的CPU上。这意味着,每个线程可以将变量复制到不同CPU的CPU缓存中。假设两个或多个线程访问一个共享对象,该对象包含如下声明的计数器变量:public class SharedObject { public int counter .

2021-12-22 20:41:58 3052

原创 多线程基础——JMM

Java内存模型(JMM)Java虚拟机是整个计算机的模型,因此这个模型自然包括一个内存模型——也就是Java内存模型。Java内存模型指定Java虚拟机如何使用计算机的内存(RAM)。它是一种虚拟机规范,屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。TheJava memory modeldescribes howthreadsin thejava programming languageinteract through memor...

2021-11-30 14:08:24 250

原创 多线程安全——synchronized原理

synchronized 它可以把任意一个非 NULL 的对象当作锁。他属于独占式的悲观锁,同时属于可重 入锁。作用范围1. 作用于方法时,锁住的是对象的实例(this);2. 当作用于静态方法时,锁住的是Class实例,又因为Class的相关数据存储在永久带PermGen (jdk1.8 则是 metaspace),永久带是全局共享的,因此静态方法锁相当于类的一个全局锁, 会锁所有调用该方法的线程;3. synchronized 作用于一个对象实例时,锁住的是所有以该对象为锁的代码块。

2021-11-23 17:15:06 4175

原创 多线程安全——synchronized锁升级

锁的状态在Java早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock来实现的,需要调用操作系统相关接口。而操作系统实现线程之间的切换时需要从用户态转换到内核态,有可能给线程加锁消耗的时间比有用操作消耗的时间更多。Java1.6后对synchronized 进行了很多的优化,有适应自旋、锁消除、锁粗化、轻量级锁及偏向锁等,效率有了本质上的提高。在之后推出的 Java1.7 与 1.8 中,均对该关键字的实现机理做了.

2021-11-18 16:09:04 3289

原创 多线程基础——锁

线程安全是程序设计中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的全局变量,使程序功能正确完成。假设有间银行只有 1000 元,而两个人同时提领 1000 元时就可能会拿到总计 2000 元的金额。为了避免这个问题,该间银行提款时应该使用互斥锁,即意味着针对同一个资源处理时,前一个人提领交易完成后才处理下一笔交易。但这种手法会使得效能降低。线程安全的函数一般不应该修改全局对象。锁的概念在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即

2021-11-04 20:01:08 2077

原创 多线程基础——API

Object类APIObject相关的方法一定是当前线程在获取了对应的锁对象才能调用,否则会抛出异常o.wait():锁对象调用该方法使当前线程进入WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放锁对象。因此,wait 方法一般用在同步方法或同步代码块中。o.wait(long):锁对象调用该方法使当前线程进入WAITING 状态,同时释放锁对象。但是超过等待的时间后线程会自动唤醒,或者被其他线程唤醒,并进入等锁池中。o.wa..

2021-11-02 10:38:32 190

原创 多线程基础——生命周期

Java线程状态​​​​​​​​​​​​​​Java线程状态官方文档Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态。A thread can be in only one state at a given point in time. These states are virtual machine states which do not reflect any operating system thread states.如果想要确定线程当前的

2021-11-01 16:11:51 102

原创 多线程基础——概念

并行计算和并发计算并行计算(parallel computing):一般是指许多指令得以同时进行的计算模式。在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式来加以解决。电脑软件可以被分成数个运算步骤来运行。为了解决某个特定问题,软件采用某个算法,以一连串指令运行来完成。传统上,这些指令都被送至单一的中央处理器,以循序方式运行完成。在这种处理方式下,单一时间中,只有单一指令被运行。并行运算采用了多个运算单元,同时运行,以解决问题。相对于串行计算,并行计算可以划分成时间并行和空间并

2021-10-27 16:36:58 234

原创 利用Gradle构建Java多模块项目

    Java新手,准备写个项目来巩固下知识点,在新建项目时不知道选择用什么作为构建工具,Maven肯定用过,只限于使用过,没有系统的去学习。之前做Android开发时用过Gradle来构建项目,也没深入研究过。后来在公司接触过用Gradle构建的java项目,才去深入了解过,描述的是Gradle是作为下一代构建工具,很灵活。我个人觉得这个灵活是体现在配置上,我看了很多使用Gradle构建多模块...

2018-04-11 02:40:33 6558 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除