多线程知识点总结

多线程知识点总结
参考:
《java核心技术I》
http://www.importnew.com/29212.html
http://www.importnew.com/18126.html
http://www.blogjava.net/xylz/archive/2010/07/08/325587.html

1.什么是线程
...
参考:https://blog.csdn.net/boshuzhang/article/details/50931781
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源
2.中断线程
interrupt
3.线程的状态
new(新创建),runnable(可运行),blocked(被阻塞),waiting(等待),time waiting(计时等待),dead(终止)
4.线程的属性
线程的优化级,守护线程
5.同步
5.1 同步问题产生的原因
如果两个或两个以上线程需要共享对同一数据的存取,即产生了同步问题
5.2 锁对象
有两种机制防止代码块受并发问题的干扰。一个是java并发包下的ReentrantLock,另一个是java提供的synchronized关键字。
5.3 条件对象
java并发包下的条件对象Condition,方法await(等同线程的await),signalAll(相当于线程的notifyAll)
5.4 synchronized关键字
参考:http://uule.iteye.com/blog/1104562
5.5 同步阻塞
可使用现有的同步队列、类等解决同步问题
5.6 volatile域
参考:http://www.importnew.com/18126.html
a. volatile关键字为实例域的同步访问提供了一种免锁机制。
b. 并发编程中的三个概念:原子性(并发引起),可见性(主内存与高速缓存的差异),有序性(cpu指令重排引起)。
c. 要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。
d. Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。
线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。
e. 那么Java语言 本身对 原子性、可见性以及有序性提供了哪些保证呢?
(1) 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。
(2) 对于可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
(3) 在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
f.volatile的使用场景:
synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,
但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。
通常来说,使用volatile必须具备以下2个条件:
1)对变量的写操作不依赖于当前值
2)该变量没有包含在具有其他变量的不变式中
5.7 线程局部变量
ThreadLocal
参考:https://blog.csdn.net/sonny543/article/details/51336457

6.阻塞队列
...
7.线程安全的集合
...
8.callable与fature
Callable与Runnable类似,但是Callable有返回值,并且有一个参数化的类型。
Fature保存异步计算的结果。
9.执行器
Executor.
10.同步器
...
11.多线程生产者消息者问题
使用await与notify或者notifyAll解决。
12.死锁问题
使用notifyAll或者wait(long mills)计时等待解决。
13.解决同步问题的方法总结
A、synchronized关键字加锁;B、ReentrantLock加锁;C、使用现有的同步队列、类等;D、使用volatile关键字。
14.你使用过java.util.concurrent包下的哪些类?
A、java.util.concurrent.ExecutionException;
B、java.util.concurrent.Future;
C、java.util.concurrent.Callable
D、java.util.concurrent.SynchronousQueue
E、java.util.concurrent.ThreadFactory;
F、java.util.concurrent.ThreadPoolExecutor;
G、java.util.concurrent.TimeUnit;
H、java.util.concurrent.atomic.AtomicInteger;
...再加上资源池相应的包org.apache.commons.pool2下的包。

原文地址:https://www.cnblogs.com/wjqhuaxia/p/9388076.html