1. 并发性 :是指两个或多个事件在同一时间间隔内发生;即在不同的CPU时间片中运行。
2. 进程同步 :是对多个相关进程在执行次序上进行协调,使并发执行的诸程序之间按照一定的规则共享系统资源,并能很好的相互合作,使程序的执行具有可再现性。
3. lock.wait(); : 是将持此锁的进程阻塞,并释放锁。当该线程被其它线程notify()后,将再次进入lock锁块,而进一步对lock上锁。
4. lock.notify(); : 是将阻塞在此锁队列上的进程唤醒。
来个例子看看:
public class Communication implements Runnable {
public int a;
public int b;
public int c;
public int d;
private Object lock = new Object();
public Communication(){
snchronized (lock) {
new Thread(this, "通话线程" + ++num).start();
//代码块1
a = 1;
lock.wait();
//代码块2
c = 1;
}
}
}
@Override
public void run() {
String message;
synchronized (lock) {
//代码块3
b = 1;
lock.notify();
//代码块4
d = 1;
}
}
}
在这个例子中我们定义了一个对象锁lock
在实例化Communication时遇到synchronize时先上锁(可以假定synchronize左花括号为上锁右花括号为释放锁)继续执行开启线程的start。
此时我们假设有两种情况:
- 执行start();之后时间片未到,则执行代码片段1,此时a = 1; 再执行lock.wait();此时lock锁被释放,主线程被阻塞,此时子线程run();执行定可以执行代码片段3使b = 1;此时若CPU时间片用光,主线程和子线程一同竞争CPU,若主线程得到CPU 但锁仍然没有释放不能继续执行代码段2,只得去执行代码段4,使d = 1,子线程跑起来了,然后遇到右括号释放锁才能执行代码段2使c = 1;
- 执行start();之后时间片到了,子线程获得CPU执行run();但锁是关着的,只得等待,则主线程执行代码段1,此时a = 1;再执行lock.wait();此时lock锁被释放,主线程被阻塞,此时子线程run();执行定可以执行代码片段3使b = 1;此时若CPU时间片用光,主线程和子线程一同竞争CPU,若主线程得到CPU 但锁仍然没有释放不能继续执行代码段2,只得去执行代码段4,使d = 1,子线程跑起来了,然后遇到右括号释放锁才能执行代码段2 使c = 1;
则从上面的两种情况看,无论如何都将在子线程跑起来之前执行代码段1 使a = 1;在子线程跑起来之后才能执行代码段2 使d = 1;即从中可以看出我们用锁方法来实现了同步与并发。实现了执行次序的实现 即
1.(a = 1) ----> 2.(b = 1,d = 1) ----> 3.(c = 1);这样的次序。