GithubHelp home page GithubHelp logo

java-concurrency's Introduction

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事!

欢迎提issue和Pull request。所有的文档都是自己亲自码的,如果觉得不错,欢迎给star鼓励支持 :)

整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到。所以在学习过程中,记录了Java并发相关的基础知识,一是自己对知识能够建立体系,同时也希望有幸能够对其他人有用。

关于Java并发专题:

(1)包含了并发的基础知识,每个标题链接到一篇具体的文章;

(2)包含了秋招面试的问题,弄懂了会让你有所收获(也祝大家都能找到心仪的工作 :) )

(3)在阅读过程中,如果有所帮助,麻烦点赞,算是对我码字的这份坚持的鼓励。

注:转载请标明原处,谢谢!

  1. 基础知识

    1.1 并发编程的优缺点

    知识点:(1)为什么要用到并发?(优点);(2)并发编程的缺点;(3)易混淆的概念

    1.2 线程的状态和基本操作

    知识点:(1)如何新建线程;(2)线程状态的转换;(3)线程的基本操作;(4)守护线程Daemon;

  2. 并发理论(JMM)

    java内存模型以及happens-before规则

    知识点:(1)JMM内存结构;(2)重排序;(3)happens-before规则

  3. 并发关键字

    3.1 让你彻底理解Synchronized

    知识点:(1)如何使用synchronized;(2)monitor机制;(3)synchronized的happens-before关系;(4)synchronized的内存语义;(5)锁优化;(6)锁升级策略

    3.2 让你彻底理解volatile

    知识点:(1)实现原理;(2)happens-before的关系推导;(3)内存语义;(4)内存语义的实现

    3.3 你以为你真的了解final吗?

    知识点:(1)如何使用;(2)final的重排序规则;(3)final实现原理;(4)final引用不能从构造函数中“溢出”(this逃逸)

    3.4 三大性质总结:原子性,有序性,可见性

    知识点:(1)原子性:synchronized;(2)可见性:synchronized,volatile;(3)有序性:synchronized,volatile

  4. Lock体系

    4.1 初识Lock与AbstractQueuedSynchronizer(AQS)

    知识点:(1)Lock和synchronized的比较;(2)AQS设计意图;(3)如何使用AQS实现自定义同步组件;(4)可重写的方法;(5)AQS提供的模板方法;

    4.2 深入理解AbstractQueuedSynchronizer(AQS)

    知识点:(1)AQS同步队列的数据结构;(2)独占式锁;(3)共享式锁;

    4.3 再一次理解ReentrantLock

    知识点:(1)重入锁的实现原理;(2)公平锁的实现原理;(3)非公平锁的实现原理;(4)公平锁和非公平锁的比较

    4.4 深入理解读写锁ReentrantReadWriteLock

    知识点:(1)如何表示读写状态;(2)WriteLock的获取和释放;(3)ReadLock的获取和释放;(4)锁降级策略;(5)生成Condition等待队列;(6)应用场景

    4.5 详解Condition的await和signal等待/通知机制

    知识点:(1)与Object的wait/notify机制相比具有的特性;(2)与Object的wait/notify相对应的方法;(3)底层数据结构;(4)await实现原理;(5)signal/signalAll实现原理;(6)await和signal/signalAll的结合使用;

    4.6 LockSupport工具

    知识点:(1)主要功能;(2)与synchronized阻塞唤醒相比具有的特色;

  5. 并发容器

    5.1 并发容器之ConcurrentHashMap(JDK 1.8版本)

    知识点:(1)关键属性;(2)重要内部类;(3)涉及到的CAS操作;(4)构造方法;(5)put执行流程;(6)get执行流程;(7)扩容机制;(8)用于统计size的方法的执行流程;(9)1.8版本的ConcurrentHashMap与之前版本的比较

    5.2 并发容器之CopyOnWriteArrayList

    知识点:(1)实现原理;(2)COW和ReentrantReadWriteLock的区别;(3)应用场景;(4)为什么具有弱一致性;(5)COW的缺点;

    5.3 并发容器之ConcurrentLinkedQueue

    知识点:(1)实现原理;(2)数据结构;(3)核心方法;(4)HOPS延迟更新的设计意图

    5.4 并发容器之ThreadLocal

    知识点:(1)实现原理;(2)set方法原理;(3)get方法原理;(4)remove方法原理;(5)ThreadLocalMap

    一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    知识点:(1)ThreadLocal内存泄漏原理;(2)ThreadLocal的最佳实践;(3)应用场景

    5.5 并发容器之BlockingQueue

    知识点:(1)BlockingQueue的基本操作;(2)常用的BlockingQueue;

    并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解

  6. 线程池(Executor体系)

    6.1 线程池实现原理

    知识点:(1)为什么要用到线程池?(2)执行流程;(3)构造器各个参数的意义;(4)如何关闭线程池;(5)如何配置线程池;

    6.2 线程池之ScheduledThreadPoolExecutor

    知识点:(1)类结构;(2)常用方法;(3)ScheduledFutureTask;(3)DelayedWorkQueue;

    6.3 FutureTask基本操作总结

    知识点:(1)FutureTask的几种状态;(2)get方法;(3)cancel方法;(4)应用场景;(5)实现 Runnable接口

  7. 原子操作类

    7.1 Java中atomic包中的原子操作类总结

    知识点:(1)实现原理;(2)原子更新基本类型;(3)原子更新数组类型;(4)原子更新引用类型;(5)原子更新字段类型

  8. 并发工具

    8.1 大白话说java并发工具类-CountDownLatch,CyclicBarrier

    知识点:(1)倒计时器CountDownLatch;(2)循环栅栏CyclicBarrier;(3)CountDownLatch与CyclicBarrier的比较

    8.2 大白话说java并发工具类-Semaphore,Exchanger

    知识点:(1)资源访问控制Semaphore;(2)数据交换Exchanger

  9. 并发实践

    9.1 一篇文章,让你彻底弄懂生产者--消费者问题

JAVA并发知识图谱

可移动到新窗口,放大查看效果更好或者查看原图

知识图谱原图链接,如果有用,可克隆给自己使用

JAVA并发知识图谱.png

java-concurrency's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

java-concurrency's Issues

Exchanger 代碼有問題

最後結果次序不對

女生慢慢的从教室你走出来......
女孩儿说:我也很喜欢你......
男孩儿说:我其实暗恋你很久了......

线程状态转换的错误,WAITING不能直接转变为RUNNABLE

线程的状态转换以及基本操作这篇文章中的线程状态转换关系.png,展示了线程可以从WAITING状态直接转变为RUNNABLE状态,但是事实不是,WAITING不能够直接转变为RUNNABLE状态,WAITING需要先转变为BLOCKED状态,获取到对象的锁后,才能够转变为RUNNABLE状态。

相关的资料:

最后的例子

想请问一下 最后的例子 如果在while循环中加入任意的代码 那么这个时候变量不加volatile关键字也能够感知到主线程的变量修改 这个地方有点不太清楚

CountDownLatchDemo

首先很感谢您的分享,知识点总结的很详细,通俗易懂。经测试,CountDownLatchDemo代码有问题,执行结果与您分享的不一致,但不知是什么问题。

关于偏向锁升级为轻量级锁的疑问

请问,原文中提到偏向锁在发生竞争时,会在全局安全点撤销。撤销之后原来持有偏向锁的线程继续执行任务时,还持有锁吗?持有的是轻量级锁?如果是轻量级锁,那么它的上锁过程是在偏向锁撤销后立即发生的吗?

关于AbstractQueuedSynchronizer类中enq方法并没有让tail指向新的尾节点的两个疑问

private Node enq(final Node node) {
        for (;;) {
            Node t = tail;
			if (t == null) { // Must initialize
				//1. 构造头结点
                if (compareAndSetHead(new Node()))
                    tail = head;
            } else {
				// 2. 尾插入,CAS操作失败自旋尝试
                node.prev = t;
                if (compareAndSetTail(t, node)) {
                    t.next = node;
                    return t;
                }
            }
        }
}

以上为enq()方法。
当队列为null时进入的enq方法,那
第一次循环是创建了头结点并且head,tail都指向此头结点。
那第二次循环是将参数node加入该头结点之后,形成第一个节点。但是为啥代码中tail没有更新呢?(意思就是现在tail,head,t都是指向"头结点")

自己的猜测:是否是在compareAndSetTail(t, node)中更新了tail值。

第二个问题是为什么返回t而不是tail?毕竟不管上面的假设成立不成立,t都指向新插入节点的前一个节点,而不是新节点。

内存使用计算问题

如果这些对象占用的内存比较大,比 如说200M左右,那么再写入100M数据进去,内存就会占用300M

这里不是500M?

4.彻底理解synchronized

如图,上面用黄色高亮的部分就是需要注意的部分了,这也是添Synchronized关键字之后独有的。执行同步代码块后首先要先执行monitorenter指令,退出的时候monitorexit指令。通过分析之后可以看出,使用Synchronized进行同步,其关键就是必须要对对象的监视器monitor进行获取,当线程获取monitor后才能继续往下执行,否则就只能等待。而这个获取的过程是互斥的,即同一时刻只有一个线程能够获取到monitor。上面的demo中在执行完同步代码块之后紧接着再会去执行一个静态同步方法,而这个方法锁的对象依然就这个类对象,那么这个正在执行的线程还需要获取该锁吗?答案是不必的,从上图中就可以看出来,执行静态同步方法的时候就只有一条monitorexit指令,并没有monitorenter获取锁的指令。这就是锁的重入性,即在同一锁程中,线程不需要再次获取同一把锁。Synchronized先天具有重入性。每个对象拥有一个计数器,当线程获取该对象锁后,计数器就会加一,释放锁后就会将计数器减一。


执行一个静态同步方法
哪里执行了同步啊?

3.java内存模型以及happens-before规则

原文中写到:
在<<深入理解Java虚拟机>>中看到的定义。原文如下: 当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。

其中加粗的地方应该是或者在调用方不进行任何其他的协调操作吧。

并发编程的优缺点中几个错别字

  1. 开头段,以提升理解和堆并发编程的认知 -> 以提示理解和对并发编程的认知
  2. 为什么要用到并发中,它只是基于认为观测数据后 -> 它只是基于人为观测数据后
  3. 3.1同步vs异步, 在超时购物->在超市购物

07.三大性质总结:原子性、可见性以及有序性

原文:如果2和3进行了重排序的话,线程B进行判断if(instance==null)时就会为true,而实际上这个instance并没有初始化成功,显而易见对线程B来说之后的操作就会是错得。

在解释双重加锁的时候提到指令重排序后,如果先分配内存地址而不是先初始化,内存地址现在已经有值,那么if(instance==null)是不是应该返回为false

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.