最近有在回顾这方面的知识,稍微进行一些整理和归纳防止看了就忘记.

会随着进度不断更新内容,比较零散但尽量做的覆盖广一点.

如有错误烦请指正~


java线程状态图


线程活跃性问题

  • 死锁
  • 饥饿
  • 活锁

饥饿原因:

  • 高优先级造成低优先级无法运行(概率吧)
  • 无法进入同步块(比如进入的线程陷入死循环)
  • 无法被唤醒(没有notify)

线程安全性问题的条件:

  • 多线程环境下
  • 多线程共享同个资源
  • 存在非原子性操作

    破坏掉其中一条即可

synchronized

内置锁

涉及字节码:monitorenter monitorexit

锁的信息存在对象头中

偏向锁 轻量级锁 重量级锁相关:



参考资料:

Synchronization

java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁


单例模式实现

积极加载

懒加载:double check,静态内部类

枚举实现

参考资料:

Java单例模式——并非看起来那么简单


volatile

硬盘 - 内存 - CPU缓存

lock指令: 当前处理器缓存行写回内存,其他处理器该内存地址数据失效

参考资料:

Java并发编程:volatile关键字解析


原子更新类

JDK5开始提供,J.U.C.atomic包

底层多是使用了Unsafe类的CAS操作.

基本分类:

  • 原子更新基本类型: AtomicInteger
  • 原子更新数组: AtomicIntegerArray
  • 原子更新引用类型: AtomicReference
  • 原子更新字段: AtomicIntegerFieldUpdater

参考资料:

Java中的Atomic包使用指南


AQS

可以作为锁 同步器的基础.

本身是一个模板类,只需要重写所需的抽象方法:

获取和释放(独占)的分析:



获取成功下直接返回.

如果获取失败,并且被中断下就直接返回.



如果没有抢占成功,则判断是否需要park,park后线程将不再被调度,park解除后返回中断状态,(但这个实现中即使被中断也没关系,在acquireInterruptibly中则会直接抛错)



是否需要park是由上一个节点的状态来决定的,在父节点为SIGNAL的情况下需要park,如果大于0(表示cancel,这个节点以及前面连续的cancel节点需要从队列里出去了)

这里可以看到不是SIGNAL的情况下父节点要么被移出要么被设置为了SIGNAL,注意这段代码外层是一个死循环,所以最终如果一直没抢占到,这个线程肯定会被park的.

这个设计在源码里就有说明,SIGNAL不是用来控制当前节点而是控制他的子节点,同时也说明这个节点的子节点正在等待.

对应release的时候也是,释放的节点(头节点)需要判断自己的状态是否小于0(为0的话说明没有子节点被添加要唤醒).

自己看源码的简单分析,只看了这一个流程.

公平和非公平主要就是对于队列的操作,公平的实现直接获取下一个节点即可.

更为详细的请参考:

【JUC】JDK1.8源码分析之AbstractQueuedSynchronizer(二)

AbstractQueuedSynchronizer的介绍和原理分析

2018年6月09日20点42分


读写锁

要注意用了一个state存了两个锁的状态 共享锁(读锁)高16位 互斥锁(写锁)低16位

读锁获取的前置条件:



读锁要获取前提是没有写锁或者有写锁但是写锁是自己持有的

这也是锁能降级的实现原理 一个线程持有写锁后可以自己持有读锁



要要获取读锁的话,得保证没有读锁,这也就是ReentrantReadWriteLock无法实现升级的原因.

所以千万不要写出这样的代码

readLock.lock();
....
writeLock.lock();
....
readLock.unlock();
....
writeLock.lock();

获取写锁时就会发生死锁.

2018年7月19日02点37分

Update:

2018年4月26日02点38分 init

2018年5月5日16点17分 单例-原子更新类

java并发编程知识点备忘的更多相关文章

  1. Java并发编程知识点总结Volatile、Synchronized、Lock实现原理

    Volatile关键字及其实现原理 在多线程并发编程中,Volatile可以理解为轻量级的Synchronized,用volatile关键字声明的变量,叫做共享变量,其保证了变量的“可见性”以及“有序 ...

  2. 干货:Java并发编程必懂知识点解析

    本文大纲 并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会 ...

  3. Java 并发编程-不懂原理多吃亏(送书福利)

    作者 | 加多 关注阿里巴巴云原生公众号,后台回复关键字"并发",即可参与送书抽奖!** 导读:并发编程与 Java 中其他知识点相比较而言学习门槛较高,从而导致很多人望而却步.但 ...

  4. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

  5. 学习笔记:java并发编程学习之初识Concurrent

    一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...

  6. Java并发编程实现概览

    并发概览 >>同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通 ...

  7. Java并发编程(十一)-- Java中的锁详解

    上一章我们已经简要的介绍了Java中的一些锁,本章我们就详细的来说说这些锁. synchronized锁 synchronized锁是什么? synchronized是Java的一个关键字,它能够将代 ...

  8. 【Java并发编程四】关卡

    一.什么是关卡? 关卡类似于闭锁,它们都能阻塞一组线程,直到某些事件发生. 关卡和闭锁关键的不同在于,所有线程必须同时到达关卡点,才能继续处理.闭锁等待的是事件,关卡等待的是其他线程. 二.Cycli ...

  9. 干货:Java并发编程系列之volatile(二)

    接上一篇<Java并发编程系列之synchronized(一)>,这是第二篇,说的是关于并发编程的volatile元素. Java语言规范第三版中对volatile的定义如下:Java编程 ...

随机推荐

  1. 博客六--Tensorflow卷积神经网络的自主搭建

    本人较懒也很忙,所以就不重复工作.连接我的开源中国博客查询:https://my.oschina.net/u/3770644/blog/3042523

  2. 实现一个简易版RPC

    上篇博客主要介绍了dubbo的使用,这篇文章主要深入rpc的核心原理 准备知识: 1 java 网络编程(这里使用的bio) 2 java动态代理 3 反射 ===================== ...

  3. 对Python选修课的期望

    作为一个之前完全没有接触过任何计算机语言的人我对于Python完完全全是个小白,那么我就以一个菜鸟的角度来谈谈我对这门选修课的期望吧.                                  ...

  4. Sql 记录死锁

    记录死锁 DBCC errorlog DBCC TRACEON (1204, 1222, -1); DBCC tracestatus 关闭跟踪标记DBCC TRACEOFF

  5. [记录]MySQL 查询无法导出到文件

    很多时候我们需要将数据导出到 xls文件, 然后交给数据分析师分析. 而这个查询数据+导出的动作,理应使用一个有只读权限的用户使用. 但查询某表时: select * from table ,此用户可 ...

  6. 【SerpentAI:Python开源游戏智能体开发框架——相比OpenAI Universe可导入自己的游戏、可脱离Docker/VNC运行】

    https://weibo.com/fly51fly?from=myfollow_all&is_all=1#1514439335614 [SerpentAI:Python开源游戏智能体开发框架 ...

  7. rem 原理与简介

    一.rem 原理与简介 字体单位:     值根据 html 根元素大小而定,同样可以作为宽度,高度等单位 适配原理:     将 px 替换为 rem,动态修改 HTML 根元素的 font-siz ...

  8. 软件光栅器实现(二、VS和PS的运作,法线贴图,切空间的计算)

    二.软件光栅器的VS和PS的输入.输出和运作,实现法线贴图效果的版本.转载请注明出处. 这里介绍的VS和PS是实现法线映射的版本,本文仅介绍实现思路,并给出代码供参考.切空间计算.光照模型等相关公式不 ...

  9. vue中的axios封装

    import axios from 'axios'; import { Message } from 'element-ui'; axios.defaults.timeout = 5000;axios ...

  10. 1405ST软件测试课的要求补充说明

    期末成绩由考勤.测试小结报告.实验报告.课堂问答.测试总结报告.(暂不安排笔试) 分数分配:考勤10%,测试小结(双周结)报告10%,实验报告30%,课堂问答20%,​测试报告30% 考勤:任选10次 ...