java 锁及同步与并发

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。

此时我们假设有两种情况:

  1. 执行start();之后时间片未到,则执行代码片段1,此时a = 1; 再执行lock.wait();此时lock锁被释放,主线程被阻塞,此时子线程run();执行定可以执行代码片段3使b = 1;此时若CPU时间片用光,主线程和子线程一同竞争CPU,若主线程得到CPU 但锁仍然没有释放不能继续执行代码段2,只得去执行代码段4,使d = 1,子线程跑起来了,然后遇到右括号释放锁才能执行代码段2使c = 1;
  2. 执行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);这样的次序。

扫描二维码关注公众号,回复: 11349034 查看本文章

猜你喜欢

转载自blog.csdn.net/baidu_41922630/article/details/101014983