进程是程序(任务)的执行过程,具备动态性;持有资源(共享内存、共享文件)和线程,是资源和线程的载体。java
线程是系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源。数据库
线程的交互,交互的方式包括互斥与同步。编程
java对线程的支持主要体如今类Thread和接口Runnable,它们都继承java.lang包,有一个共同的方法run()安全
public class ArmyRunnable implements Runnable { //volatile保证了线程能够正确读取其余线程写入的值 volatile boolean keepRunning = true; @Override public void run() { while(keepRunning) { //发动五连击 for (int i = 0; i < 5 ; i++) { System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]"); } //暂停 Thread.yield(); } System.out.println(Thread.currentThread().getName() + "结束了战斗"); } }
当多个线程同时共享访问同一数据(内存区域)时,每一个线程都尝试操做该数据,从而致使数据被破坏(corrupted),这种现象称为争用条件。网络
互斥:在同一时间,只能有一条线程去对咱们的关键数据或临界区进行操做。多线程
互斥的实现:sysnchronized(intrinsic lock),sysnchronized至关于给代码加上一把锁,使其余线程不能进入这个关键区域访问咱们的关键资源。并发
同步:是线程之间的一种通讯机制, 因为一条线程的某些条件不具有,使得其余线程处于某种等待的状态,以后因为条件具有了,一条线程会用某种方式唤醒其余的线程。ide
同步的实现:wait()/notify()/notifyAll()--Object对象的成员方法工具
wait set 是线程的休息室性能
public void transfer(int from, int to, double amount) { //经过synchronized 关键字来实现互斥,synchronized既能够出如今方法之上,也能以块的形式出如今方法体之中 //经过对lockObj加锁实现互斥 //加锁操做是有开销的,屡次加锁操做会下降系统的性能 synchronized (lockObj) {//while循环,保证条件不知足时任务都会被条件阻挡,而不是继续竞争CPU资源 while (energyBoxes[from] < amount) { try { //条件不知足,将当前线程放入锁对象(lockObj)上的wait set //wait set 是线程的休息室 lockObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); energyBoxes[from] -= amount; System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to); energyBoxes[to] += amount; System.out.printf("能量总和:%10.2f%n",getTotalEnergies()); //唤醒全部在lockObj对象上等待的线程 lockObj.notifyAll(); } }
Java Memory Mode
Locks & Condition
线程安全性: 原子性与可见性 ...
多线程编程经常使用的交互模型
Java5中并发编程工具
core java
Java concurrency in practice