java-concurrent:start
Table of Contents
Java并发
如何实现多线程
三种实现方式:实现Runnable接口,实现Callable接口,或者继承Thread类(其实Thread类也是实现的Runnable接口)
Callable和Runnable的区别: Callable还允许线程带有返回值返回,而Runnable没有
不过真正大家写代码的时候,都是用Executor线程池的方式。
线程状态及相互通信
ThreadA a = new ThreadA(); //此时是New状态 a.start(); //此时是Runnable状态(可能正在执行,也可能正在等待CPU的时间片) //当使用同一个对象的synchronized线程中,有一个线程获得锁,执行synchronized的方法体,那么其他线程就Blocked的状态 //当线程执行方法体内调用 wait()时,那么就会释放锁,然后进入Waiting 无限期等待 状态 //当线程执行方法体内调用notify(), notifyAll() 就能将wait的线程恢复为Runnable. Thread.sleep(3000) //此时本线程进入 Timing Waiting有限时间等待的状态,但不会释放锁。 另外: 任何异常会导致线程 释放锁,线程终止,所以必须catch异常。 await, signal,signalAll 相当于是jdk版本的实现。 wait(), notify(), notifyAll() 是jvm版实现 类似ReentrantLock是同步锁的jdk版本实现,synchronized关键字是同步锁的jvm版本实现
并发工具类
并发工具类:CountDownLatch, CyclicBarrier, Semaphore的使用, 参考 并发工具类
关于线程池
请参考:线程池
关于Java内存模型
java线程之间的通信由java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间 的共享变量存储在主内存中, 每个线程都有一个私有的本地内存,本地内存存储了该线程以读/写共享 变量的副本。 重排序(编译器和处理器为了优化性能而做的指令重排序) JMM限制重排序 为程序员提供内存可见性保证 happens-before 八大原则
volatile & sychronized
volatile大致的原理: 写入到工作内存的时候,立刻刷新到主内存。
读工作内存的时候,置失效,直接去主内存读。
sychronized: 可重入 http://www.morganliao.com/wiki/doku.php?id=java-concurrent:sychronized
ReentrantLock 相当于 synchronized的jdk版实现。但是比后者更强大,更灵活。同时支持公平锁。 可重入
并发集合
CurrentHashMap https://blog.csdn.net/liuyuanq123/article/details/80283913
JDK7的实现和 JDK8的实现 https://www.cnblogs.com/lijiasnong/p/9963808.html
CopyOnWrite
java-concurrent/start.txt · Last modified: 2019/09/12 09:24 by 127.0.0.1