01线程A运行结束 , 增加“20” , 当前用户账户余额为:6102线程D运行结束 , 增加“-30” , 当前用户账户余额为:6303线程B运行结束 , 增加“-60” , 当前用户账户余额为:304线程F运行结束 , 增加“21” , 当前用户账户余额为:6105线程E运行结束 , 增加“32” , 当前用户账户余额为:9306线程C运行结束 , 增加“-80” , 当前用户账户余额为:6107Process finished with exit code 0复制代码线程A运行结束 , 增加“20” , 当前用户账户余额为:61线程D运行结束 , 增加“-30” , 当前用户账户余额为:63线程B运行结束 , 增加“-60” , 当前用户账户余额为:3线程F运行结束 , 增加“21” , 当前用户账户余额为:61线程E运行结束 , 增加“32” , 当前用户账户余额为:93线程C运行结束 , 增加“-80” , 当前用户账户余额为:61Process finished with exit code 0很显然 , 上面的结果是错误的 , 导致错误的原因是多个线程并发访问了竞争资源u , 并对u的属性做了改动 。
可见同步的重要性 。
注意:
通过前文可知 , 线程退出同步方法时将释放掉方法所属对象的锁 , 但还应该注意的是 , 同步方法中还可以使用特定的方法对线程进行调度 。这些方法来自于java.lang.Object类 。
01void notify()02唤醒在此对象监视器上等待的单个线程 。03void notifyAll()04唤醒在此对象监视器上等待的所有线程 。05void wait()06导致当前的线程等待 , 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法 。07void wait(long timeout)08导致当前的线程等待 , 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法 , 或者超过指定的时间量 。09void wait(long timeout, int nanos)10导致当前的线程等待 , 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法 , 或者其他某个线程中断当前线程 , 或者已超过某个实际时间量 。复制代码void notify()唤醒在此对象监视器上等待的单个线程 。void notifyAll()唤醒在此对象监视器上等待的所有线程 。void wait()导致当前的线程等待 , 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法 。void wait(long timeout)导致当前的线程等待 , 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法 , 或者超过指定的时间量 。void wait(long timeout, int nanos)导致当前的线程等待 , 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法 , 或者其他某个线程中断当前线程 , 或者已超过某个实际时间量 。【Java如何实现线程同步?线程同步的方法和反面教材】以上步骤便是Java多线程编程中的线程同步用法 , 为了清楚了解这部分概念 , 笔者还展示了反面教程的使用 , 避免用户走更多的弯路 。
推荐阅读
- 摘下的未成熟的枣子怎么变红
- iPhone13或推出墨绿色型号 还为iPad Air提供新选择
- 路飞五皇多少集
- 人物图片的背景柔化及简单调色
- 育儿师是干什么的
- 网上查征信和银行一样吗
- 阴阳师残局得胜第四天听君言 阴阳师残局得胜星熊童子攻略
- 烤鱼片一般都是什么鱼
- Win7环境下微软雅黑怎么安装?微软雅黑字体如何使用?