4.0 Java之多线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwz45698752/article/details/82782926

多线程


#死锁问题
在这里插入图片描述
在这里插入图片描述

  • 若上方线程抢占第一把锁,执行sleep方法,则下方线程执行,抢占第二把锁,上方线程继续,等待第二把锁以执行完run方法,而下方线程则等待第一把锁以执行完run方法,双方陷入僵持状态。

#线程通信

在这里插入图片描述

  • notify唤醒优先级最高的wait线程,若一样则随机选取一线程唤醒

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • A线程抢占锁,执行一次结束,wait被挂起,释放锁,B线程去执行,唤醒之前被wait的线程A(但A线程没有持有锁,不能执行同步方法),同样执行完一次,挂起,释放锁,然后A线程接着wait后的代码执行,即继续循环执行,如此反复,直到num大于100,交替打印完毕,break
  • wait方法释放同步锁,其他线程可抢占该锁,等待其他线程执行完毕或被唤醒,接着wait方法的下方执行

#回顾账户存钱问题

  • 改为两账户交替存钱
    在这里插入图片描述

#生产者消费者问题
在这里插入图片描述

  • 回忆上章两客户向同一一账户存钱取钱操作,则店员看为共享数据,类比Account,店员持有的产品数量看为balance,生产者和消费者类比银行客户,
  • 涉及到共享数据才考虑线程安全问题,即同步问题

在这里插入图片描述

  • 产品数量在Clerk类中
  • 异常自行处理
  • 生产大于等于20,则停止,若消费一件产品后,有空位,再次唤醒生产,消费同理
  • 关于打印位置,生产处先生产后打印,消费处先打印后消费(消费了第几件产品)
  • 两同步方法锁默认为this,则notifyAll()等价于this.notifyAll() 【唤醒所有的生产者】就可以了,不需要显式指明XXX.notifyAll()

在这里插入图片描述

  • Producer要能操作共享数据,所以要声明Clerk的引用变量
  • run方法内只负责生产,至于停止开始由Clerk类负责

在这里插入图片描述

  • 要在某类里操作共享数据,则在该类里声明Clerk变量(间接操作)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lwz45698752/article/details/82782926