为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

大话西游666 2019-04-26 22:19:27
如下代码所示,为什么继承了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 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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

查看完整回答
反对 回复 2019-05-14
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

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

查看完整回答
反对 回复 2019-05-14
  • 3 回答
  • 0 关注
  • 749 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号