java什么是并发?
并发与并行
并发:是指在某个时间段内,多任务交替的执行任务。当有多个线程在操作时,把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行。 在一个时间段的线程代码运行时,其它线程处于挂起状。
并行:是指同一时刻同时处理多任务的能力。当有多个线程在操作时,cpu同时处理这些线程请求的能力。
所以在并发环境下,程序的封闭性被打破,出现以下特点:
1、并发程序之间有相互制约的关系。直接制约体现为一个程序需要另一个程序的计算结果;间接体现为多个程序竞争共享资源,如处理器、缓冲区等。
2、并发程序的执行过程是断断续续的。程序需要记忆现场指令及执行点。
3、当并发数设置合理并且CPU拥有足够的处理能力时,并发会提高程序的运行效率。
在并发环境中,当一个对象可以被多个线程访问到时,会造成该对象可以被任何访问到的线程进行修改,从而出现数据不一致的情况。所以提出线程安全的概念。
线程基本概念介绍
线程与进程
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位) 。简单讲进程就是在某种程度上相互隔离的、独立运行的程序。
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
1、创建: 新创建了一个线程对象,还未调用start()方法。 如 Thread thread = new Thread();
2、就绪: 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中 获取cpu 的使用权 。
3、运行: 运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
4、阻塞(Blocked):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待着获取到一个排它锁,这个事件将在另外一个线程放弃这个锁的时候发生;而“等待状态”则是在等待一段时间,或者唤醒动作的发生。在程序等待进入同步区域(synchronized)的时候,线程将进入这种状态。
(一). 等待阻塞: 运行(running) 的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞: 运行(running) 的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞: 运行(running) 的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入 可运行(runnable) 状态。
5、等待: 进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
6、阻塞:当一个线程试图获取一个内部的对象锁(非java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态。
7、等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。
8、超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
9、终止(TERMINATED):表示该线程已经执行完毕。