java多线程编程

Little  BigUs Little BigUs 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

下面是代码,我想问的是循环中的sleep语句注释与不注释会产生什么影响,我之所以会有这个疑问是因为书上说多个线程访问同一资源时会有线程安全问题,例如下面的代码就可能出现第0张票甚至第-1张票的可能,但是我发现下面的代码如果没有sleep就几乎不会出现差错,而加上sleep后几乎次次都会差错,我一直认为出现差错就是在while(tickets > 0)这一句的判断上,如果a线程和b线程同时运行,此时tickets=1,当a判断时显然结果是true,但是当a还没执行到tickets--这一步时b又进行判断的,得到的结果也是true,所以会出现0的情况,当然由于线程执行速度很快,所以差错只是偶尔出现,但如果人为的sleep就会提高差错率,可是如果按照我的想法的话,把sleep放到tickets--后面的话就不会影响了,因为此时的tickets已经变了,但事实证明不像我想的那样,求指教

这应该和 tickets-- 或 --tickets没什么关系吧,我都试过了

package ThreadTest;

public class Example05 {

public static void main(String[] args) {
TicketWindow2 tw = new TicketWindow2();
Thread t1 = new Thread(tw, "窗口一");
Thread t2 = new Thread(tw, "窗口二");
Thread t3 = new Thread(tw, "窗口三");
t1.start();
t2.start();
t3.start();
}
}

class TicketWindow2 implements Runnable {

int tickets = 10;
@Override
public void run() {
// TODO Auto-generated method stub
while(tickets > 0) {
System.out.print(Thread.currentThread().getName()+"正在出售第"+tickets-- +"张票!\n");
// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }

}
}

}
...全文

相关推荐

Java多线程编程总结

下面的内容是很早之前写的,内容不够充实,而且是基于Java1.4的内容,Java5之后,线程并发部分扩展了相当多的内容,因此建议大家看上面的系列文章的内容,与时俱进,跟上Java发展的步伐。要认识多线程就要从操作系统的原理说起。以前古老的DOS操作系统(V6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的

weixin_38622125

java多线程编程实例

主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下。

weixin_38600017

Java多线程-Socket编程

Java多线程-Socket编程

chenxiaoting12

java 多线程编程指南

java多线程编程指南,一个比较高级和深入的java编程学习资料。

gaoxiaoyun00130901

Java多线程编程实例

这是Java多线程编程实例一书的全部随书源码,这本书是很早的JAVA多线程编程指导书,虽然很老但是很经典,直到现在还很热,很有参考价值。

javry
评论 4
收藏 已收藏
分享
返回顶部
Little  BigUs
Java SE 62,621 成员 307,251 内容