一个线程输出结果的背后逻辑,大家帮忙进来看看,理一理。。。

qq_29448025 2017-04-09 01:48:56
class Ticket extends Thread
{
private static int num = 10; //定义成static,2个线程共享10张票。
public void run()
{
while(num>0)
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
}

class Maipiao
{
public static void main(String[] args)
{
Ticket win1 = new Ticket();
Ticket win2 = new Ticket();
win1.start();
win2.start();
}
}


某次运行结果如下:
Thread-1...sale...10
Thread-0...sale...10

Thread-1...sale...9
Thread-0...sale...8
Thread-0...sale...6
Thread-0...sale...5
Thread-0...sale...4
Thread-0...sale...3
Thread-0...sale...2
Thread-0...sale...1
Thread-1...sale...7

问题是:为什么10号票可以出两次呀,怎么就卖出11张票了呢?

...全文
373 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT_tangh 2017-04-14
  • 打赏
  • 举报
回复
建议楼主读读《java并发编程实战》《java并发编程的艺术》,了解下线程安全问题
qq_29448025 2017-04-14
  • 打赏
  • 举报
回复
引用 5 楼 galiniur0u 的回复:
楼主要知道一个问题就是原子操作的问题,而--并非原子操作,就会产生同一变量,线程读写冲突的问题。楼主可以使用synchronized,volatile,AtomicInteger来实现功能。
这个回答中”原子操作的问题,而--并非原子操作,就会产生同一变量,线程读写冲突的问题“,好深奥呀,有相关文章推荐一下给我看看吗?
田地里的蚂蚁 2017-04-10
  • 打赏
  • 举报
回复
public class Demo {
	public static void main(String[] args) {
		R r1 = new R();
		R r2 = new R();
		r1.start();
		r2.start();
	}
}
class R extends Thread {
	private static int num = 10;
	public void run() {
		minus();
	}
	public synchronized void minus() {
		while (num > 0) {
			System.out.println(Thread.currentThread().getName() + "出售第"
					+ (num--) + "张票");
		}
	}
}
运行结果: Thread1出售第10张票 Thread2出售第9张票 Thread1出售第8张票 Thread2出售第7张票 Thread1出售第6张票 Thread2出售第5张票 Thread1出售第4张票 Thread1出售第2张票 Thread1出售第1张票 Thread2出售第3张票 要对变量进行操作的方法加锁,避免出现线程并发
galiniur0u 2017-04-10
  • 打赏
  • 举报
回复
楼主要知道一个问题就是原子操作的问题,而--并非原子操作,就会产生同一变量,线程读写冲突的问题。楼主可以使用synchronized,volatile,AtomicInteger来实现功能。
  • 打赏
  • 举报
回复
两个线程对同一个共享变量进行操作,这是一个多线程并发的问题,在对共享变量数据操作加锁就ok了。。。 楼上的也还是有问题,会出现票数为0的情况,在数据操作的方法中增加Thread.currentThread.sleep(10)时,会出现0的情况。。。
tas_yusheng 2017-04-09
  • 打赏
  • 举报
回复
线程安全问题,加同步代码块
李德胜1995 2017-04-09
  • 打赏
  • 举报
回复
引用 1 楼 qq_29448025 的回复:
换了一种写法,同样也出了问题。
class Ticket1 implements Runnable
{
    private int num = 10;
    public void run()
    {
        while(num>0)
            System.out.println(Thread.currentThread().getName()+"...sales..."+num--);
    }
}

class Maipiao1
{
    public static void main(String[] args)
    {
        Ticket1 t = new Ticket1();

        Thread win1 = new Thread(t);
        Thread win2 = new Thread(t);
        win1.start();
        win2.start();
    }
}
某次运行结果如下: Thread-0...sales...10 Thread-1...sales...9 Thread-0...sales...8 Thread-1...sales...7 Thread-0...sales...6 Thread-1...sales...5 Thread-1...sales...4 Thread-1...sales...3 Thread-1...sales...2 Thread-1...sales...1 Thread-0...sales...0 晕,也多买出了一张票,0号票。
加锁就可以了。。。。
李德胜1995 2017-04-09
  • 打赏
  • 举报
回复
多线程操作静态成员变量,线程非安全问题。。。。。
qq_29448025 2017-04-09
  • 打赏
  • 举报
回复
换了一种写法,同样也出了问题。
class Ticket1 implements Runnable
{
    private int num = 10;
    public void run()
    {
        while(num>0)
            System.out.println(Thread.currentThread().getName()+"...sales..."+num--);
    }
}

class Maipiao1
{
    public static void main(String[] args)
    {
        Ticket1 t = new Ticket1();

        Thread win1 = new Thread(t);
        Thread win2 = new Thread(t);
        win1.start();
        win2.start();
    }
}
某次运行结果如下: Thread-0...sales...10 Thread-1...sales...9 Thread-0...sales...8 Thread-1...sales...7 Thread-0...sales...6 Thread-1...sales...5 Thread-1...sales...4 Thread-1...sales...3 Thread-1...sales...2 Thread-1...sales...1 Thread-0...sales...0 晕,也多买出了一张票,0号票。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧