-
问题描述
按理说,当第一个线程(前面)的synchronized获得对象锁了以后,第二个线程(后面)就只能等待,当第一个线程添加完list,执行demo.list.notify()方法只会通知等待队列中的第一个相关线程,根据输出结果看是去唤醒第二个线程,这个时候第二个线程执行添加list。问题是:但是notify()方法不会释放锁,且第一个线程先获取到锁,那么第二个线程是应该是无法先获取到锁的,是如何进入wait()方法,等待第一个线程获取的
-
案例代码
public class ThreadCommunication { private final List<Integer> list =new ArrayList<>(); public static void main(String[] args) { ThreadCommunication demo =new ThreadCommunication(); new Thread(()->{ for (int i=0;i<10;i++){ synchronized (demo.list){ if(demo.list.size()%2==1){ try { demo.list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } demo.list.add(i); System.out.print(Thread.currentThread().getName()); System.out.println(demo.list); demo.list.notify();//不会释放锁 } } }).start(); new Thread(()->{ for (int i=0;i<10;i++){ synchronized (demo.list){ if(demo.list.size()%2==0){ try { demo.list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } demo.list.add(i); System.out.print(Thread.currentThread().getName()); System.out.println(demo.list); demo.list.notify(); } } }).start(); } }