java并发编程, since 12-01
并发编程专题
- JAVA内存模型(JMM)
- java当中的线程通讯和消息传递
- 什么是重排序和顺序一致性?Happens-Before?As-If-Serial?
- Synchronized的概念和分析
- 锁的是对象(object)/类的实例(this)/class。不要用字符串常量来当锁,因为字符串在常量池里面。不用new的在常量池里面。同步方法和非同步方法是否可以同时调用?synchronize锁可重入。sync锁碰到异常要处理,不被处理锁会被释放。volatile保证变量的可见性,防止指令重排序。java中线程通信方式是内存共享 JMM。java 的 .start()没有启动线程,只是形成了一个对象,有一个本地方法,线程对象,由系统内核操作启动,可能Main执行完,线程才启动。sync 既保证原子性,又保证可见性。volatile不保证原子性。多个原子操作连续使用是否能保证原子性?两个原子操作(在JVM里面是一行指令)不能保证原子性,相当于两个操作,而sync可以保证原子性。
- 同步、重量级锁以及Synchronized的原理分析
- 自旋锁、偏向锁、轻量级锁、重量级锁的概念、使用以及如何来优化他们
- Volatile和DCL的知识
- Volatile的使用场景和Volatile实现机制、内存语义、内存模型
- DCL的单例模式,什么是DCL?如何来解决DCL的问题
- 并发基础之AQS的深度分析
- AbstractAueuedSynchronizer同步器的概念、CLH同步队列是什么?
- 同步状态的获取和释放、线程阻塞和唤醒
-
Lock和并发常用工具类
- java当中的并发工具类CyclicBarrier、CountDownLatch、Semphore
- java当中的并发集合类ConcurrentHashMap、ConcurrentLinkedQueue……
- 原子操作常用知识讲解
- 基本类型的原子操作比如经典的AtomicBoolean、AtomicLnteger、AtomicLong
- 数组类型的原子操作代表几个类AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
- 引用类型的原子操作的典型AtomicReference、AtomicReferenceFieldUpdater……
- CAS的概念和知识、Compare And Swap 以及他的缺陷
- 线程池和并发并行
- Executor、ThreadPoolExecutor、Callable; Future ScheduledExecutorService
-
ThreadLocal、Fork、Join?什么是并行?线程池如何保证核心线程不被销毁?
- java当中的Lock、ReentrantLock、ReentrantReadWriteLock、Condition B站子路av78670785:共7个小时左右的视频,从12月1号开始看,到12月30号才看完。。。醉了醉了。
- 在类中定义一个reentrantLock, 然后线程中Lock该对象,释放该对象,就可以实现线程的顺序执行。
- sync 1.6之前是重量级锁,调用native方法java自带的方法,C语言的方法,java/jdk1.8/java.exe里面,hotspot项目生成的java.exe。在openjdK源码中实现。CPU在执行操作系统函数的时候需要进入内核态。用户函数则是进入用户态。sync的时候线程和操作系统线程是一一对应的。1.7就优化成轻量级锁,亲生的儿子。
- reentrantlock 是为了解决sync的问题,写了JUC包,然后sun公司又优化了sync方法。
- 自旋就是while循环
- hashMap 中的concurrentHashmap 1.8之前用的是reentrantlock,现在是concurrent锁。
- sync 关键字没有源码,所以都不知道是不是对的。wait是为了线程通信,要基于sync关键字同时使用。
- yield + 自旋。yield 在系统中只有两个线程竞争时,是有效的,线程多则不能完成线程同步的功能。
- unsafe 这个类可以申请堆外内存。
- park() 就是让这个线程暂停,Unpark就是立刻唤醒该线程。
- reenlock 是公平所还是非公平锁,默认是公平锁,非公平锁要程序员写。
- sync没有公平与非公平之区别。
- reentrantlock是java级别的切换,比sync快,没有os级别的pack切换。
- reentrantlock-单个线程或者交替执行的线程是无关的,在jdk级别解决同步问题,只需要在reentrantlock的state属性改变就行,跟AQS无关,用CAS改变state属性的值。
- 重入锁的意义:当当前执行线程和当前持有锁的线程是同一个,就把当前锁的计数加1,表示重入的次数。
- reentrantlock中AQS的第一个节点永远是Null的线程
- sync关键字 B站鲁班学院sync关键字av80352987:共187分钟的视频,预计6天学完,从12月30日开始哦
- sync关键字锁堆中的实例对象
- 用纯java实现的锁是reentrantlock ,reentrantlock加锁就是把state变为1。
- sync加锁加在对象头的地方。(mark word 和 class point 组成对象头)
- 《深入理解java虚拟机》是32位的机器。
- 如何学并发?从Java的历史开始学习。
- volatile: 保证变量可见性,但是不保证原子性。用atomic类的变量。
- 线程通信方式:内存共享+发送消息。Java使用的是内存共享。
- sync保证可见性和原子性。
- 用字符串常量当锁有没有问题?
- 有问题,是字符串面量,如果两个代码段同时对这个加锁,会发现有一个根本拿不到锁。
- 实现一个容器,提供两个方法 add, size。写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束线程2。
- 用volatile,保证t2线程对list变量监控。但是while true浪费资源 + 不一定在5的时候结束。
- sync(lock),用t2去lock.wait(),在t1等于5的时候lock.notify()。wait会释放锁,但notify不会释放锁。解决:用两次wait和两次notify。
- 最佳方案: latch。CountDownLatch 在t2中 latch.wait, t1 中 latch.countDown(),