leoma2012
leoma2012
2019-03-31 21:03
采纳率: 100%
浏览 720
已采纳

继承thread的线程不能使用同步方法吗

如下代码所示,为什么继承了Thread的线程使用同步方法的时候无法锁住呢?而使用同步代码块就没有问题

package leetcode;

import javax.swing.plaf.synth.SynthSeparatorUI;

import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable;

public class mainEntry
{
    public static void main(String[] agrs)
    {
        // 创建 3 个窗口
        TicketSell t1 = new TicketSell("A窗口");
        TicketSell t2 = new TicketSell("B窗口");
        TicketSell t3 = new TicketSell("C窗口");

        // 启动 3 个窗口进行买票
        t1.start();
        t2.start();
        t3.start();
    }
}

class TicketSell extends Thread
{
    private static int num = 50;

    public TicketSell(String name)
    {
        super(name);
    }

    @Override
    public void run()
    {
        for(int i = 0;i<50;i++)
            sell();
    }
    public synchronized void sell() {
        if (num > 0)
        {
            try
            {
                // 模拟卖一次票所需时间
                Thread.sleep(10);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println(this.currentThread().getName() + "卖出一张票,剩余" + (--num) + "张");
        }
    }

}

这是输出
....
A窗口卖出一张票,剩余2张
C窗口卖出一张票,剩余1张
B窗口卖出一张票,剩余0张
A窗口卖出一张票,剩余-1张

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • wojiushiwo945you
    毕小宝 2019-04-01 16:24
    已采纳

    可以啊,关键是看你选择同步的锁的类型,如你缩写使用的是类实例作为锁,而每个实例都被自己使用当然不涉及到互斥的问题。
    Java并并发编程实践中对共享变量所加的锁应该是相同锁。

    点赞 评论
  • vane11
    Vane11 2019-04-01 11:44

    上面这个写法,synchronized 只是修饰了一个public方法,这个方法只属于当前实例,同一个实例内才会同步
    把方法改成static修饰或者像上面描述的那样,synchronized修饰代码块也可以

    点赞 评论
  • GzlAndy
    GzlAndy 2019-04-01 15:12

    没有使用同一个锁加锁

    点赞 评论

相关推荐