>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 30519 个阅读者 刷新本主题
 * 贴子主题:  线程的同步 中的代码错误 回复文章 点赞(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开发-->JSP中使用JavaBean(Ⅰ)
  JSP与Hibernate开发-->域对象在持久化层的四种状态
  Java网络编程-->非阻塞通信
  精通Spring-->绑定CSS样式
  Vue3开发-->虚拟DOM和render()函数
  CRMEB_Java新零售社交电商系统
  实用类 EncodingDetect,查看一个文件的字符编码
  求素数
  分布式锁的原理和实现
  Java多线程volatile详解
  Eclipse使用指南:常用视图(View) 的用法
  Java Scoket之java.io.EOFException解决方案
  Java入门实用代码:List 循环移动元素
  Java入门实用代码:修改链表LinkedList
  Java入门实用代码:压栈出栈的方法实现字符串反转
  Java入门实用代码:链表元素查找
  Java入门实用代码:文件重命名
  Java入门实用代码:字符串替换
  Java入门实用代码:查找字符串最后一次出现的位置
  java实现PPT转化为PDF
  更多...
 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前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。