java并发编程


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(),