多线程
文章平均质量分 86
散_步
但行好事,莫问前程
展开
-
java对象内存布局与对象头
java对象内存布局与对象头Object object = new Object()谈谈你对这句话的理解?一般而言JDK8按照默认情况下,new一个对象占多少内存空间位置:JVM里堆→新生区→伊甸园区构成布局:在Hotspot虚拟机里,对着在堆内存中的存储布局可以划分三个部分:对象头、实例数据、和对齐填充1.对象头:对象头标记MarkWord:对象头里面保存着什么:在64位系统中,MarkWord占8个字节,类型指针占了8个字节,一共是16个字节默认存储对象的HashCode,原创 2021-04-04 15:27:58 · 573 阅读 · 0 评论 -
Synchronized与锁升级
synchronized 锁用锁能够实现数据的安全性,但是会带来性能下降,无锁能够基于线程并行提升程序性能,但是会带来安全性下降。锁的升级过程:无锁—>偏向锁----> 轻量锁----->重量锁synchronized 锁: 由对象头中的Mark Word 更具锁标志位的不同而被复用及锁升级策略java5以前,只有synchronized ,这个是操作系统级别的重量级操作,重量级锁,假如锁的竞争比较激烈的话,性能下降,java5之前,用户态和内核态之间的切换java的线程是映原创 2021-04-04 23:17:05 · 155 阅读 · 0 评论 -
对象的内存布局
对象的内存布局原创 2023-01-03 22:29:48 · 471 阅读 · 1 评论 -
synchronized底层原理
synchronized底层原理原创 2023-01-02 20:53:54 · 1963 阅读 · 1 评论 -
JUC基础知识扫盲
进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。是指系统中正在运行的一个应用程序;程序一旦运行就是进程,进程----资源分配的最小的单元线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单元。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每个线程并行执行不同的任务。系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程-----程序执行的最小单元。线程原创 2021-07-27 23:33:40 · 161 阅读 · 0 评论 -
ThreadLocal
ThreadLocal简介:是什么?ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。能干嘛?实现每一个线程都有自己专属的本地变量副本(自己用自己的变量不麻烦别人,不和其他人共享,人人有份,人各一份),主要解决了让每个线程绑定自己的值,通过使用get(原创 2021-04-08 19:33:31 · 113 阅读 · 0 评论 -
原子操作类
基本类型原子类AtomicIntegerAtomicBooleanAtomicLong常用API简介public final int get() //获取当前的值public final int getAndSet(int newValue)//获取当前的值,并设置新的值public final int getAndIncrement()//获取当前的值,并自增public final int getAndDecrement() //获取当前的值,并自减public final int .原创 2021-04-08 19:06:39 · 178 阅读 · 1 评论 -
CAS
CAScompare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期原值及更新值。执行CAS操作的时候,将内存位置的值与预期原值比较:如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。原理:硬件级别保证:CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性。它是非阻塞的且自身原子性,也就是说这玩意效率更高且通过硬件保证,说明这玩意更原创 2021-04-08 18:33:32 · 136 阅读 · 1 评论 -
volatile与Java内存模型
被volatile修改的变量有2大特点:1.可见性2.有序性volatile的内存语义:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。内存屏障:内存屏障(也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同原创 2021-04-08 18:18:55 · 132 阅读 · 1 评论 -
Java内存模型之JMM
计算机硬件存储体系:计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存,到CPU。一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算因为有这么多级的缓存(cpu和物理主内存的速度不一致的),CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题Java虚拟机规范中试图定义一种Java内存模型(java Memory Model,简称JMM) 来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下原创 2021-04-08 17:35:20 · 181 阅读 · 1 评论 -
LockSupport与线程中断
如何停止、中断一个运行中的线程??什么是中断?首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线原创 2021-04-08 17:11:36 · 186 阅读 · 0 评论 -
公平锁和非公平锁
排队讲求先来后到视为公平。程序中的公平性也是符合请求锁的绝对时间的,其实就是 FIFO,否则视为不公平**按序排队公平锁,就是判断同步队列是否还有先驱节点的存在(我前面还有人吗?)如果没有先驱节点才能获取锁;先占先得非公平锁,**是不管这个事的,只要能抢获到同步状态就可以为什么会有公平锁/非公平锁的设计为什么默认非公平?1.恢复挂起的线程到真正锁的获取还是有时间差的,从开发人员来看这个时间微乎其微但是从CPU的角度来看这个时间差存在的还是很明显的**,所以非公平锁能更充分的利用CPU的时间片,原创 2021-04-08 16:42:48 · 128 阅读 · 0 评论 -
Java锁
乐观锁和悲观锁:悲观锁: 认为自己在使用的数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线索修改。synchronized关键字和Lock的实现类都是悲观锁 显式的锁定之后再操作同步资源乐观锁: 乐观锁认为自己在使用的数据时不会有别的线程修复数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新这个数据如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作。乐观锁在Java中通常使原创 2021-04-08 15:52:41 · 105 阅读 · 0 评论 -
CompletableFuture
Future和Callable接口:Future接口定义了操作异步任务执行一些方法,如获取异步任务的执行结果,取消任务的执行,判断任务是否被取消,判断任务执行是否完毕等。Callable 接口中定义了需要有返回的任务需要实现的方法比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,过了一会才去获取子任务的执行结果。FutureTask:future接口架构:get()阻塞一旦调用get()方法,不管是否计算完成都会导致阻塞isDone原创 2021-04-08 15:16:10 · 310 阅读 · 0 评论 -
JUC基础知识
为什么多线程重要?两个方面:1.硬件方面 摩尔定律:失效它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。2.软件方面:高并发系统,异步+回调等生产需求线程start开始:java线程是通原创 2021-04-08 13:46:15 · 143 阅读 · 0 评论 -
ReentrantLock、ReentrantReadWriteLock、StampedLock
ReentrantReadWriteLock读写锁定义为:一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。ReentrantReadWriteLock 并不是真正意义上的读写分离,它只允许读读共存,而读写和写写依然是互斥的,大多实际场景是 读读线程间并不存在互斥关系,只有读、写线程 或者是写写线程间的操作需要互斥的。一个ReentrantReadWriteLock同时只能存在一个写锁但是可以存在多个读锁,但不能同时存在写锁和读锁(切菜还是拍蒜选一个)。也即一个原创 2021-04-05 21:07:15 · 354 阅读 · 0 评论 -
AQS
AQS AbstractQueueSynchronized 简称AQS是什么:抽象的队列同步器是用来构建锁或者其他同步器组件的重量级基础框架及整个JUC体系的基石通过内置的FIFO队列完成资源获取现成的排队工作,并通过int类变量标识持有锁的状态AQS为什么是JUC内容中最重要的基石?ReentrantLock CountDownLatch ReentrantReadWriteLock Semaphore … 底层都是AQS锁,是面向锁的使用者,定义了程序员和锁交互的使用层API,隐原创 2021-04-05 14:09:20 · 124 阅读 · 0 评论 -
多线程的那些事
start:开启线程并执行该线程的run方法. run:仅仅是对象调用方法,而线程创建了,并没有执行.临时阻塞状态:具备运行资格但没有执行权. 冻结状态:放弃了执行资格.(睡眠和等待) 运行状态:具备运行资格和执行权.static Thread currentThread();获取当前线程对象. getName():获取线程名称. 设置线程名称:setName或者构造函数. 为什么要将R原创 2017-11-16 15:59:55 · 179 阅读 · 0 评论