2 yl123456654321 yl123456654321 于 2015.06.18 15:39 提问

java多线程同步的问题

小测试,如何实现变量ticket的同步

private int ticket = 100;
public void run()
{
    while(ticket > 0 ) {
        System.out.println(ticket+" is saled by "+
                            Thread.currentThread().getName());
        ticket--;
        try
        {
            Thread.sleep(200);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

6个回答

bulusli3
bulusli3   Ds   Rxr 2015.06.18 16:46
已采纳

这样写public synchronized void run()
{
while(ticket > 0 ) {
System.out.println(ticket+" is saled by "+
Thread.currentThread().getName());
ticket--;
try
{
Thread.sleep(200);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}

或者这样写

private Object obj = new Object();

public void run() {
    synchronized (obj) {
        while (ticket > 0) {
            System.out.println(ticket + " is saled by "
                    + Thread.currentThread().getName());
            ticket--;
        }
    }
    try {
        Thread.sleep(200);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
yl123456654321
yl123456654321 明白了!谢谢
2 年多之前 回复
bulusli3
bulusli3 回复ICTY: 哥们,按照你的意思,多个线程同时操作ticket,应该这样写。你不能在多线程方法里又加上while循环,那样线程的正常执行流程就乱了。你可以开100个线程,去调用run方法,这样才能检验是否同步了。 public synchronized void run() { if (ticket > 0) { System.out.println(ticket + " is saled by " + Thread.currentThread().getName()); ticket--; } }
2 年多之前 回复
yl123456654321
yl123456654321 我现在能实现的方法就是while(ticket > 0 ) { lock.lock(); if(ticket > 0) {System.out.println(ticket);ticket--;}lock.unlock(); 但是总觉得判断两次ticket有点别扭
2 年多之前 回复
yl123456654321
yl123456654321 我现在能实现的方法就是while(ticket > 0 ) { lock.lock(); if(ticket > 0) {System.out.println(ticket);ticket--;}lock.unlock(); 但是总觉得判断两次ticket有点别扭
2 年多之前 回复
bulusli3
bulusli3 回复ICTY: 当然不对,因为你这个没有锁全,你要把凡是用到了ticket的地方都加锁。
2 年多之前 回复
yl123456654321
yl123456654321 给System.out.println(ticket+" is saled by "+Thread.currentThread().getName()); 和 ticket--; 前后加lock.lock和lock.unlock的话,最后会打印ticket=0...到-6。还是不对
2 年多之前 回复
bulusli3
bulusli3 回复ICTY: 第二个方法就是ticket同步的,已经锁住了ticket变量了。不过要把while换成if,否则会死循环的。
2 年多之前 回复
yl123456654321
yl123456654321 我是希望ticket保持同步,也就是多个线程操作同一个ticket变量
2 年多之前 回复
jiawei0418
jiawei0418   2015.06.18 16:40

synchronized(我是锁){我是线程;}是要这个么?

yl123456654321
yl123456654321 我加过,但是我希望的是多个线程同时操作变量ticket
2 年多之前 回复
yl123456654321
yl123456654321   2015.06.18 16:51

我是希望ticket保持同步,也就是多个线程操作同一个ticket变量

jiawei0418
jiawei0418   2015.06.18 16:55

那就把ticket设置成static的 那样就可以了

yl123456654321
yl123456654321 这样做不行..
2 年多之前 回复
Q40355098
Q40355098   2015.06.18 22:53

ticket可以做成原子孙,不要用基本类型

yl123456654321
yl123456654321 是直接声明成原子类型吗?好像结果也不太正确!
2 年多之前 回复
yl123456654321
yl123456654321   2015.06.23 14:13

想了下,这样不行,我考虑的是两步及多步操作的同步...

Csdn user default icon
上传中...
上传图片
插入图片