多线程
文章平均质量分 55
java请多指教
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
模拟排队论(多线程高并发)亲测有效
排队论的场景(可以根据自己的需求进行修改):假设医院上午工作时间8:00-11:00,下午工作时间2:00-500,医院只有五个窗口可以进行就诊且医生就诊完一位病人的时间固定(处理时间固定),我们通过Random类随机生成病人到达医院的时间点并且可以进行更改使得一个时间段的病人很多。通过输出每一个病人响应时间计算出平均响应时间,从而进行效率分析。话不多说上代码import java.util.Arrays;import java.util.Random;import java.util.concu原创 2021-05-27 08:52:22 · 411 阅读 · 0 评论 -
设计模式(一):单例模式以及volatile在单例模式中的应用(禁止指令重排序)
饿汉式:私有化构造方法,不管需不需要用到Mgr01实例,先创建一个实例,仅提供一个共有的获取实例的方法(线程安全)懒汉式:私有化构造方法,提供一个静态获取Mgr03实例的方法(首先判断实例是否已经创建,没有创建才会开始创建实例)(线程不安全)私有化构造方法,将获取实例的方法用synchronize修饰同步方法,效率不高原因:synchronize修饰方法需要注意同步代码的范围不能太大也不能太小,太大效率不高,太小线程不安全(线程安全,效率不高)还是线程不安全,原因:一开始还没有创建实例,多个线程原创 2021-04-20 16:53:25 · 183 阅读 · 0 评论 -
synchronize底层原理
1、java代码层面预备知识:对象在内存中的内存布局synchronize可以用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。1、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。2、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非s.原创 2021-04-19 11:01:36 · 235 阅读 · 0 评论 -
多线程锁状态以及锁升级过程
多线程锁状态图锁升级的过程(接下来会进行一一解释)上篇文章介绍的对象内存布局有解释markword统一解释:偏向锁位以及锁标志位用于区分是哪一种锁状态一、无锁态刚new出一个对象,没有线程需要使用这个对象,此时对象的markword对象头8字节中记录的锁信息如下图所示:二、偏向锁第一个线程使用这个对象时,会将对象的markword对象头切换为偏向锁状态,如下图所示,其中最关键的标红字段记录了当前线程的指针,表明当前对象被锁住,只偏向于当前线程。三、轻量级锁当有任何一个线程开始竞争该原创 2021-04-16 16:18:37 · 255 阅读 · 1 评论 -
面试题(对象在内存中的内存布局):Object o = new Object()在内存中占多少字节
面试题(对象在内存中的内存布局):Object o = new Object()在内存中占多少字节一、首先我们利用ClassLayout类去解析实例对象并打印输出并进行分析输出结果:以上运行结果与下面这张图(对象在内存中的存储布局)一致;markword对象头占8字节:用于存储锁信息(后续将锁升级过程中会提及)类型指针如果采用压缩指针的方式则占4字节,没有采用压缩指针则占8字节实例数据:由于我们这边只new了一个对象,没有设置成员变量,这边为0;假如有int类型的变量则为4字节对齐是为了保证原创 2021-04-16 15:28:19 · 355 阅读 · 0 评论 -
CAS(底层原理以及存在的问题解决方法)
CAS(compare and swap比较并且交换 )作用:在不使用锁的情况下支持多线程,CAS又被称作:轻量级锁,无锁,自旋锁(很形象,后续会解释)整体过程(举例:多线程情况下实现对某个数字A实现加1操作)首先读取这个数字A当前值,执行+1操作获得结果值A+1,接下来会进行比较并且交换操作:将原先读取的当前值与当前新值进行比较,相等再进行替换操作,用结果值替换原先的值,不相等会重复执行以上步骤,这一步自旋的过程呼应上面说的自旋锁存在的问题:1、虽然我们比较结果相同,但是会不会在交换的时候数据原创 2021-04-15 23:43:22 · 313 阅读 · 0 评论
分享