并行:同时执行,不会打扰到彼此,每一个任务都有自己的时间片。
并发:上下文切换,CPU时间片只有能一个。
高并发:某一时刻(小时,分钟,秒,天)大量请求到来。
Java对并发的支持:
线程,比进程轻,如果要创建更多的线程,可以在启动程序时指定单个线程大小,对于操作系统来说,一个线程是一个完成的执行单元,仍属于JVM进程,JVM进程中JMM对于线程来说都是共享的,每个线程都可以独立调度,而且有自己的栈和程序计数器,但会和同个进程中的其他线程共享内存和对象。
e.g:
Runnable th =()->{
System.out.println(Thread.currentThread().getName());
};
Thread th2 = new Thread(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
Thread th2 = new Thread(()->{
System.out.println(Thread.currentThread().getName());
});
线程生命周期:
NEW 已经创建没有调用start方法。
RUNNABLE 线程正在运行,或当前操作系统调度线程时可以运行。
BLOCKED 线程中止运行,等待获得一个锁,以便进入临界区。
WAITING 线程中止运行,临界区中调用了wait或join。
TIMD_WAITING 线程中止运行,调用了sleep或wait,join 并传入了超时时间。
TERMINATED 线程执行完毕,线程对象的run() 方法正常退出,或抛出异常。
线程的可见性:
每一个线程都有自己的栈,但是都引用了相同的堆,因此可以轻易的共享内存对象,只是把从一个线程传到另外一个线程。
由此可见,对象是默认可见的。
对象是默认可变的(对象的内容),
final关键字可以把变量或引用生命为常量,但这种字段不属于对象的内容。
并发编程的安全性:
在一个程序中,不管调用什么方法,也不管操作系统如何调度应用线程,一个对象看到任何其他对象都不处于非法或不一致状态,这样的程序才称的上是安全的多线程程序。
安全的面向对象程序: 通过调用对象的存取方法,把对象从一个合法状态变成另一个合法状态。
安全性:
互斥: 只要修改或读取对象过程中,对象的状态可能不一致,这段代码可能就要受到保护,synchronized,
java平台会为它创建的每个对象纪录一个特殊的标记,这个标记叫做监视器,synchronized使用这些监视器指明,
synchronized 修饰的代码块或方法会发生一系列事件,详述如下:
(1) 线程需要修改对象时,会临时把对象变成不一致状态;
(2) 线程获取监视器,指明它需要临时互斥存储这个对象;
(3) 线程修改对象,修改完毕后对象处于一致的合法状态;
(4) 线程释放监视器。
如果在修改对象的过程中,其他线程尝试获取锁,Java 会阻塞这次尝试,直到拥有锁的线
程释放锁为止。
安全性:
可见性 volatile ,用于并发访问数据,线程退出标志位,double check,该关键字指明,在使用字段或者变量前必须从主内存中读,写的时候也必须存回主内存,也避免了重排序。
private volatile boolean shutdown = false;
public void shutdown() {
shutdown = true;
}
public void run() {
while (!shutdown) {
}
}
同步是为了保护对象的状态和内存,而不是代码。
同步是线程间协助机制,一个缺陷就可能破坏这种协助模型,导致严重的后果。
获取监视器只能避免其他线程再次获取这个监视器,而不能保护对象。
即便对象的监视器锁定了,不同步的方法也能看到(和修改)不一致的状态。
锁定Objectp[] 不会锁定其中的单个对象。
基本类型的值不可变,因此不能锁定。
接口中声明的方法不能用synchronized修饰。
内部类只是语法糖,因此内部类的锁对外层类无效,反过来也是如此。
Java的锁可重入,意味着如果一个线程拥有一个监视器,这个线程遇到具有同一个监视器的同步代码块时,可以进入这个代码块。
Java 的线程模型基于三个基本概念。
• 状态是共享的,可变的,而且默认可见
意思是,在同一个进程中,对象可在不同的线程间轻易共享,而且只要线程中有对象的
引用,就可以修改对象。
• 抢先式线程调度
几乎任何时候,操作系统的线程调度程序都能把线程调入和调出内核。
• 对象的状态只能由锁保护
锁很难正确使用,而且状态十分脆弱,即便是读取操作也可能会得到不可思议的结果。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------