线程同步:协同工作,按预定的先后次序运行。
监视线程:用于监控多个线程运行的情况。就如上级与员工的关系:上级的任务就是监督多个员工工作进度的。
Synchronized:同步关键字。保证同一数据不能同时被两个或多个线程修改。
多个线程执行在同一代码中,但是不能同时运行,可以用同步关键字synchronized,把synchronized放到方法,也可放到代码块中。这时,synchronized的作用就像是一把锁,当第一个线程进入后,synchronized会把标志位置于0,当后面的线程进来时,发现标志位是0而阻塞等待。直到第一个线程运行完成,把标志位置于1,后面的线程才能进入。
注意!!!当synchronized放入代码块中,synchronized的参数是线程共有的东西。
如:在银行取现的例子,不能用同一个账户通过不同的方式同时取现。可用synchronized实现。
wait/notify机制
多线程间的协同工作。如果不满足条件,则wait(),无法继续运行下面的代码。当满足条件条件时,则notify(),线程被唤醒。Wait/notify机制与同步机制密切相关。wait()/notify()必须放在同步锁之内。例如:生产/消费模型可以通过wait/notify机制实现。
//消费者
public void run() {
synchronized (list) {
while(true){
if(list.isEmpty()){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product product = list.remove(0);
System.out.println("消费者消费了一个产品,他的名字是"+ product.getName());
list.notify();
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//生产者
public void run() {
synchronized (list) {
int i = 1;
while(true){
if(!list.isEmpty()){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product product = new Product("IPone"+(i++));
list.add(product);
System.out.println("生产者生产了一个产品,他的名字是"+ product.getName());
System.out.println("KKKKKKKKKKKKK");
list.notify();
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
如上面的例子:
1. synchronized的参数是线程共有的东西。
2.wait/notify机制是放到同步锁之内。
3.当消费者不满足条件时,则等待,直到生产者改变条件,消费者满足条件时才继续执行。
同理:当生产者不满足条件时,则等待,直到消费者改变条件,生产者满足条件时才继续执行。
4.休眠时间不一致不影响执行的结果。
线程
最新推荐文章于 2019-06-11 01:00:30 发布