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

继承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条回答 默认 最新

  • 毕小宝 博客专家认证 2019-04-01 16:24
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 微信小游戏反编译后,出现找不到分包的情况
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题