JUC

串行: 串行就是线程完成整个流程是按照顺序执行,如果是多个任务,必须一个一个来,要等前一个执行完才执行后面的

并行: 并行就是可以同时获取多个任务,并且可以同时执行多个任务

并发:是一个CPU或者是CPU的一个同时执行多个任务.

并行和并发的区别:
并行是多个CPU或者一个多核CPU,执行任务,就是并行.,并发,需要分CPU的时间片,任务占用CPU,任务随机轮流执行


线程的六种状态:

NEW 新建状态,线程对象刚创建
RUNNABLE 就绪状态,等待 CPU 时间片
# 两个线程,一个进入sleep状态占有同步锁,另外一个线程就进入阻塞状态
BLOCKED 阻塞状态,wait方法,等待同步锁
WAITING 等待状态,等待被唤醒notify或者notifyAll
TIMED_WAITING 限时等待状态,进入等待状态设定了等待时间,时间到了线程回到就绪状态
TERMINATED 终止状态,代码运行完,线程结束

wait和sleep方法的区别:

wait是线程进入WAITING等待状态,会释放锁,需要另外的线程通过notify或者notifyAll方法唤醒,sleep是线程进入TIMED_WAITING状态,不会释放锁,等时间到休眠结束,自己再运行完才释放锁,其次前者是Object类的非静态方法,后者是Thread类的静态方法


锁的使用各种情况:
如果两个线程开启用同一个对象了,此时加锁并没有使用同一把锁,则所不生效,例如是两个对象,或者一个是静态同步方法,一个是非静态同步方法,或者是代码块指定的锁对象不一样,使用各自的锁(不是同一个锁对象),则各自线程各运行各的,没有锁住.


同步代码块和同步方法的区别:
同步代码块的作用域和锁都是可以自定义设定的,同步方法的作用域就是这个方法,静态的同步方法的锁是(类命.class)对象,非静态的同步方法就是this对象.


synchronized锁改良后的几种锁的状态:
锁膨胀的过程:无锁==>>偏向锁==>>轻量锁==>>重量锁

锁清除:去除不可能存在竞争的锁,锁对象是局部变量

锁粗化:自动扩大锁的范围,避免反复的申请加锁和释放锁

自旋锁:当一个线程碰到一个被锁住的方法,不会去阻塞队列等待,而是在被锁的方法外继续执行一些无意义代码,等这个锁释放.适合场景,锁占用的时间段,这个时候就在锁外面等,自旋有很大几率就马上获得到锁,不适用场景,锁占用的时间长,因为自旋的时间过长就会过于消耗CPU性能

自适应自旋锁:是自旋锁的升级,这个线程自旋的次数不在是固定的,而是由上一次自旋的时间来决定了


对象包括对象头,对象体,对其字节

对象头:包括Mark Word和Klass Pointer两个区域

klass pointer:指向元数据区的类,每个变量都属于它自己的类

mark word有对应着五种状态:

01状态==>>指向0的时候是无锁状态

01状态==>>指向1的时候是偏向锁状态,此时会有一个偏向线程ID,标记那个偏向的线程

00状态==>>轻量锁状态,

10状态==>>重量锁状态

11==>>垃圾回收GC状态


监视器(ObjectMonitor)

  • 三个关键变量

_EntryList : 处于等待锁 block 状态的线程,会被加入到该列表(阻塞队列)

_count : 锁计数器

_owner : 指向当前线程

  • monitorenter和monitorexit指令(monitorexit有两个)

把class文件进行反编译javap,可以查看到monitorenter和monitorexit两个指令

当加锁或者阻塞时,运行monitorenter指令,当锁释放或者抛出异常的时候运行monitorext指令,


可重入性

可重入性就是指一个线程可以直接获得它自己加的锁,如果不可重入性则就会导致死锁,而且锁不住数据


JMM(Java memory model)

需要掌握的概念: 主内存,工作内存

原子性 : 如果没有保持原子性,主内存的共享变量,各个线程先从主内存读取到工作内存,在自己的工作内存区域内运行,但是会导致重复覆盖主内存的共享变量,就会出错

可见性 : 如果没有可见性,每个线程只始终都是在从自己的本地内存获取数据,没有去读取主内存,就出错了.

有序性 : 用户代码class文件的指令最终到 CPU 上执行的时候都会转变为 CPU 能够识别的指令,而 CPU 在执行时为了提升性能,会对这些指令进行重排序,但是这些排序是有规范的,无需我们考虑


volatile关键字

volatile 写的内存语义:当一个 volatile 变量时,JMM 会把该线程对应的本地内存中的变量值 flush 到主内存

volatile 读的内存语义:当一个 volatile 变量时,JMM 会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。


CAS锁机制

compare and swap

旧值比较,如果比较成功,就修改为新值,如果旧值不对失败,则读取正确的旧值,再用读取的旧值去比较,这次就成功了,就可以修改为新值.

如果旧值一直再被其他线程修改,那么在等待读取正确旧值的线程就循环反复读取正确的旧值,直到读取到正确的,这也就是自旋的过程.

相比较于乐观锁:
乐观锁时相比CAS锁机制多了版本号,更新一次后会更新版本号.
CAS锁机制因为没有版本号可能会有ABA问题,但是不影响使用.


AQS: AbstractQueuedSynchronizer 抽象的队列式同步器,它维护了一个 volatile int state(代表共享资源),这里 volatile 是核心关键词。state 的访问方式有三种:

  • getState()
  • setState()
  • compareAndSetState()

底层是实现了共享资源的state状态的获取与释放

AQS机制=CAS机制+volatile关键字


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 知识点: 线程生命周期(新建、运行、阻塞、等待(一直等待)、超时等待(超时取消等待)、终止); Synchroni...
    CJ21阅读 1,742评论 1 21
  • 5 Volatile 关键字 保证内存可见和有序向性,但是不保证原子性 虽然synchronized,jvm对它做...
    任笙_8b8c阅读 729评论 0 1
  • Catalog 1 线程池原理1.1 ThreadPoolExecutor构造器1.2 拒绝策略1.3 线程池工作...
    allen锅阅读 255评论 0 1
  • 总的来说还可以,学到一些新知识,但很多是学过的了,深入的部分不多。 线程与进程 进程:一个程序,程序的集合,比如一...
    卡斯特梅的雨伞阅读 306评论 0 1
  • synchronized synchronized作用 原子性:synchronized保证语句块内操作是原子的。...
    小波同学阅读 763评论 0 7