1.线程同步
处理多线程同时运行的问题。
多线程同时操作同一对象的数据,将会形成对自己操作的数据不同步的情况。
如银行取款问题:
当用存折和银行同时取钱时,会执行怎样的结果?
如下列代码:
一般我们在初学时可能会使得两者同时取钱都会成功。就是说,如果在银行总共存了三百,然而你却在卡和存折同时各取二百,最终结果显然不合常理。这是由于CPU在运行进程1时同时运行了进程2,导致同时运行。而且在扣除额度时,1还未扣除,2就已经运行扣除。
此时,使用同步锁synchronized来解决问题,同步锁是在运行进程1时将变为0,直到运行完才变为1,在这期间将不会有其他进程访问。
2.wait/notify
这是一个等待,一个通知。当在一个对象上调用wait()方法是,当前线程会进入wait状态,直到收到另一个对象notify发出的通知,才会执行下一步计划。
3.线程的生命周期
当线程创建时,点击就绪,进入就绪状态,CPU运行时开始运行,使用run方法;run释放,线程结束。如果线程在中途sleep的话就睡眠,睡眠完毕进入就绪状态,然后在运行等待CPU回来。如果线程等待,就会释放CPU;阻塞时就是进行同步锁。阻塞结束,就再次回到就绪状态。
处理多线程同时运行的问题。
多线程同时操作同一对象的数据,将会形成对自己操作的数据不同步的情况。
如银行取款问题:
当用存折和银行同时取钱时,会执行怎样的结果?
如下列代码:
public class Account {
//额度属性
private int count;
public Account(int count){
this.count = count;
}
//取现的流程
public int getCash(int cash){
//1.验证额度是否足够取现
if(count<cash){
//取现失败
return -1;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//扣除额度
count = count - cash;
}
return count;
}
}
一般我们在初学时可能会使得两者同时取钱都会成功。就是说,如果在银行总共存了三百,然而你却在卡和存折同时各取二百,最终结果显然不合常理。这是由于CPU在运行进程1时同时运行了进程2,导致同时运行。而且在扣除额度时,1还未扣除,2就已经运行扣除。
此时,使用同步锁synchronized来解决问题,同步锁是在运行进程1时将变为0,直到运行完才变为1,在这期间将不会有其他进程访问。
2.wait/notify
这是一个等待,一个通知。当在一个对象上调用wait()方法是,当前线程会进入wait状态,直到收到另一个对象notify发出的通知,才会执行下一步计划。
如生产-消费模型
public class CustomerThread extends Thread {
// 仓库
private ArrayList<IPhone7> list;
public CustomerThread(ArrayList<IPhone7> list) {
this.list = list;
}
public void run() {
// 不停地执行生产操作
while (true) {
synchronized (list) {
if (list.size() ==0) {
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产一个手机
IPhone7 iphone = list.remove(0);
System.out.println("消费者从仓库中取出了一个手机,型号为:"+iphone.name);
list.notify();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
在这之中,wait时CPU不进行任何操作,就避免其他情况下CPU运行超载,。只有notify运行发出通知是,CPU才运作。
3.线程的生命周期
当线程创建时,点击就绪,进入就绪状态,CPU运行时开始运行,使用run方法;run释放,线程结束。如果线程在中途sleep的话就睡眠,睡眠完毕进入就绪状态,然后在运行等待CPU回来。如果线程等待,就会释放CPU;阻塞时就是进行同步锁。阻塞结束,就再次回到就绪状态。