继承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张


大话西游666
浏览 750回答 3
3回答

拉莫斯之舞

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

qq_笑_17

可以啊,关键是看你选择同步的锁的类型,如你缩写使用的是类实例作为锁,而每个实例都被自己使用当然不涉及到互斥的问题。Java并并发编程实践中对共享变量所加的锁应该是相同锁。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java