ant_1024 2016-06-19 03:43 采纳率: 60%
浏览 1188

关于java线程synchronized为什么药用常量

package thread;

class SaleTicket extends Thread{
public SaleTicket(String name) {
// TODO Auto-generated constructor stub
super();
}
static int num = 50;
Object o = new Object();
// static String o = new String();
@Override
public void run(){
while(true){
synchronized(this){

            if(num > 0){
                System.out.println(
                Thread.currentThread().getName() + "售出" + num + "票");

                num--;
            }else{
                System.out.println("没了");
                break;
            }
        }
    }
}

}
public class Demo04 {

public static void main(String[] args){
    SaleTicket st = new SaleTicket("1");
    SaleTicket st2 = new SaleTicket("2");
    SaleTicket st3 = new SaleTicket("3");
    st.start();
    st2.start();
    st3.start();
}

}
结果
Thread-1售出50票
Thread-0售出50票
Thread-0售出48票
Thread-2售出50票
Thread-0售出47票
Thread-1售出49票
Thread-0售出45票
Thread-2售出46票
Thread-2售出42票
Thread-2售出41票
Thread-2售出40票
Thread-2售出39票
Thread-0售出43票
Thread-1售出44票
Thread-0售出37票
Thread-2售出38票
Thread-0售出35票
Thread-1售出36票
Thread-0售出33票
Thread-2售出34票
Thread-0售出31票
Thread-1售出32票
Thread-0售出29票
Thread-2售出30票
Thread-0售出27票
Thread-1售出28票
Thread-0售出25票
Thread-2售出26票
Thread-2售出22票
Thread-0售出23票
Thread-1售出24票
Thread-0售出20票
Thread-2售出21票
Thread-0售出18票
Thread-1售出19票
Thread-0售出16票
Thread-2售出17票
Thread-0售出14票
Thread-1售出15票
Thread-0售出12票
Thread-2售出13票
Thread-0售出10票
Thread-1售出11票
Thread-0售出8票
Thread-2售出9票
Thread-0售出6票
Thread-1售出7票
Thread-0售出4票
Thread-2售出5票
Thread-0售出2票
Thread-1售出3票
没了
没了
Thread-2售出1票
没了

package thread;

class SaleTicket extends Thread{
public SaleTicket(String name) {
// TODO Auto-generated constructor stub
super();
}
static int num = 50;
Object o = new Object();
// static String o = new String();
@Override
public void run(){
while(true){
synchronized("w"){

            if(num > 0){
                System.out.println(
                Thread.currentThread().getName() + "售出" + num + "票");

                num--;
            }else{
                System.out.println("没了");
                break;
            }
        }
    }
}

}
public class Demo04 {

public static void main(String[] args){
    SaleTicket st = new SaleTicket("1");
    SaleTicket st2 = new SaleTicket("2");
    SaleTicket st3 = new SaleTicket("3");
    st.start();
    st2.start();
    st3.start();
}

}

Thread-0售出50票
Thread-0售出49票
Thread-0售出48票
Thread-0售出47票
Thread-0售出46票
Thread-0售出45票
Thread-0售出44票
Thread-2售出43票
Thread-2售出42票
Thread-2售出41票
Thread-2售出40票
Thread-2售出39票
Thread-2售出38票
Thread-2售出37票
Thread-2售出36票
Thread-2售出35票
Thread-2售出34票
Thread-2售出33票
Thread-2售出32票
Thread-2售出31票
Thread-2售出30票
Thread-2售出29票
Thread-2售出28票
Thread-2售出27票
Thread-2售出26票
Thread-2售出25票
Thread-2售出24票
Thread-2售出23票
Thread-2售出22票
Thread-2售出21票
Thread-2售出20票
Thread-2售出19票
Thread-2售出18票
Thread-2售出17票
Thread-2售出16票
Thread-2售出15票
Thread-2售出14票
Thread-2售出13票
Thread-2售出12票
Thread-2售出11票
Thread-2售出10票
Thread-2售出9票
Thread-2售出8票
Thread-2售出7票
Thread-2售出6票
Thread-2售出5票
Thread-2售出4票
Thread-2售出3票
Thread-2售出2票
Thread-2售出1票
没了
没了
没了

为什么sychronized会输出三个50而将sychronized里的this换成字符串就可以了?

  • 写回答

2条回答 默认 最新

  • Robot-C 2016-06-19 03:52
    关注



    看到一个关于Java锁机制Synchronized很贴切的比喻,忍不住抄袭过来:
     
    打个比方:一个object就像一个大房子,大门永远打开。房子里有很多房间(也就是方法)。这些房间有上锁的(synchronized方法), 和不上锁之分(普通方法)。房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间。另外我把所有想调用该对象方法的线程比喻成想进入这房子某个 房间的人。所有的东西就这么多了,下面我们看看这些东西之间如何作用的。
    在此我们先来明确......
    答案就在这里:java线程锁机制Synchronized
    ----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集