首页
AI Coding
沸点
课程
直播
活动
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
登录
注册
敢敢雷
掘友等级
Java
心碎了一地的憨憨雷
获得徽章 0
动态
文章
专栏
沸点
收藏集
关注
作品
赞
1
文章 1
沸点 0
赞
1
返回
|
搜索文章
最新
热门
JAVA并发(10)并发编程基础
这是《JAVA并发编程的艺术》(方腾飞)第四章的内容,这里主要做下总结。 每启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这个线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享…
JAVA并发(9)深入分析DCL
DCL,即Double Check Lock,双重检查锁定。DCL很多人在单例模式中用过,博主之前面试的时候,就遇到过手写一个单例,然后饿汉和懒汉都手撕了一遍,但是面试管当时好像不是很满意,于是机智的博主赶紧指出了懒汉的线程安全问题,加上双重校验锁。现在就分析下为什么要加上DC…
JAVA并发(8)final域
final域的读和写像是普通的变量访问。 对于final域,编译器和处理器要遵守两个重排序规则。 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final…
JAVA并发(7)根据JMM分析volatile
当声明变量为volatile后,对这个变量的读/写将会很特别。 volatile是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。 在并发编程中我们一般都会遇到这三个基本概…
JAVA并发(6)重排序
重排序是值编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 其实这两点可以归结于一点:无法通过happens-before原则推导出来的,JMM允许任意的排序。 如果两个操作访问同一个变量…
JAVA并发(5)happens-before
从JDK5开始,JMM就使用happens-before的概念来阐述多线程之间的内存可见性,在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。这里提到的两个操作既可以是在同一个线程内,也可以是在不同的线程之间。…
JAVA并发(4)原子操作的实现原理
原子本意是“不能被进一步分割的最小粒子”,而原子操作意为“不可被中断的一个或一系列操作”。 处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。 如果多个处理器同时对共享变量进行读改写操作,那么共享就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完后,…
JAVA并发(3)锁的状态
为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。所以锁一共有4种状态,级别从低到高依次是:无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。 锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。 “偏向”的…
JAVA并发(2)synchronized和volatile底层实现原理
在最初学习多线程的时候,只要遇到同步问题我就会使用synchronized关键字,在解决问题时感觉非常好用。后来到了web阶段,当用户访问过多的时候,也会出现多线程问题,这个时候加上一个synchronized,简直酸爽,再后来不断学习的过程中,慢慢也了解到synchroniz…
JAVA并发(1)并发编程的挑战
记得刚开始学JAVA的时候,在并发这一块最薄弱,只能做一些简单的多线程使用和对锁的使用,在其底层压根就没考虑过,最近抽空买了本JAVA并发编程艺术,要仔细认真的学习下。 一次上下文切换就是任务从保存到再加载的过程,因为处理器支持多线程执行代码的通过给每个线程分配CPU时间片来实…
下一页
个人成就
文章被点赞
8
文章被阅读
17,914
掘力值
282
关注了
3
关注者
8
收藏集
0
关注标签
3
加入于
2020-03-30