>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 30518 个阅读者 刷新本主题
 * 贴子主题:  线程的同步 中的代码错误 回复文章 点赞(0)  收藏  
作者:liuyuan    发表时间:2017-01-19 20:38:59     消息  查看  搜索  好友  邮件  复制  引用

public class Machine implements Runnable {
  private int a=1;  //共享数据
  public void run() {
    for(int i=0;i<1000;i++){
      a+=i;
      Thread.yield();  //给其他线程运行的机会
      a-=i;
      System.out.println(a);
    }
  }
  public static void main(String args[]) throws InterruptedException{
    Machine machine=new Machine();
    Thread t1=new Thread(machine);
    Thread t2=new Thread(machine);
    t1.start();
     t2.start();
  }
}
备注:即使开启2个线程结果仍然是1,不会发生任何变化


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->第一个Java程序
  JavaWeb开发-->Servlet技术详解(Ⅲ)
  JSP与Hibernate开发-->映射组成关系
  Java网络编程-->非阻塞通信
  精通Spring-->Vue简介
  Vue3开发-->Vue组件开发高级技术
   JAVA进阶之IO模型深入解析
  Java内存设置详解(含内存溢出问题的解决)
  JAVA锁相关知识总结
  volatile 实现原理
  分布式锁的原理和实现
  如何优雅地打印一个Java对象?
  NoClassDefFoundError和ClassNotFoundException的区别
  Java读取大文件的高效率实现_java大文件
  java比c++强大之处JVM垃圾收集算法
  Java入门实用代码:死锁及解决方法
  Java入门实用代码: 集合中添加元素
  Java 入门实用代码:取最大和最小值
  史上最全正则表达式合集(马上收藏)
  通过Java读取Excel数据
  java零基础入门-面向对象篇 抽象类
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 sunweiqin 
  

威望: 0
级别: 高级天王 [荣誉]
魅力: 480
经验: 480
现金: 1128
发文章数: 171
注册时间: 2016-09-12
 消息  查看  搜索  好友  邮件  复制  引用


线程的调度依赖于本地机器。以上结果表明每个线程在执行for语句中的一次循环时,是至少执行完本次循环,才释放cpu的。也就是说,这个线程在执行Thread.yield()方法时,底层的调度系统并没有把cpu让给其他的线程。从这里可以看出,Thread.yield()方法不会强迫当前线程把运行机会让给其他线程,仅仅是增加一些可能性。因此,我们的程序代码依靠Thread.yield()方法来精确地控制线程之间的协调是不安全不可靠的。

您可以把Thread.yield()方法改为: try{Thread.sleep(500);}cathch(Exception e){}
再看看运行效果。此处调用Thread.sleep(500)方法的目的是为了更明显地出现并发问题。
发文章时间 2017-02-09 14:57:27
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。