java多线程,临界资源值问题

package demo01;

class Window extends Thread{
static int num=200;
String name=new String();
Window(String name){
this.name=name;
}

public synchronized void run(){
    synchronized(Thread.currentThread()){
        while(num>0){
            System.out.println(name+"售出一张,剩余"+--num);
            }
    }
}

}

public class TicketSail {

public static void main(String[] args) {
    try {
        Window w1 = new Window("哈站");
        Window w2 = new Window("哈西");
        Window w3 = new Window("哈东");
        w1.start();
        w2.start();
        w3.start();
    } catch (Exception e) {
        // TODO: handle exception
    }
}

}
为什么num输出总有乱的,弄了好久没弄懂,求问题原因及解决方法
图片说明

你这是3个线程在跑,应该把num加上synchronized关键字,要加锁的是num这个属性,不是线程。

多线程在跑,你看到的打印结果是乱的很正常,属性加锁属于扯淡,而且你的代码有BUG,你加上延迟之后Thread.sleep(1000)再跑一下试试

synchronized(Thread.currentThread())
1、你这种加速方式等同于没有加锁。既然多线程竞争临界区资源,这个锁必然是多个线程征用的,你写的“Thread.currentThread()”这个你觉得会被
其他线程征用吗?
2、解决方法,可以在TicketSail 里给一个对象当做锁,通过构造方法传递给window,然后让其他几个线程去征用,就是synchronized(锁)

ps:关于多线程可以多看看源码和JDK的api文档

public class Window extends Thread {
static int num = 100;
String name = new String();

Window(String name) {
    this.name = name;
}

public synchronized void run() {

    while (num > 0) {
        synchronized (Window.class) {
            if (num > 0) {
                System.out.println(name + "售出一张,剩余" + --num);
            }
        }
        try {
            sleep(200);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

public static void main(String[] args) {
    try {
        Window w1 = new Window("哈站");
        Window w2 = new Window("哈西");
        Window w3 = new Window("哈东");
        w1.start();
        w2.start();
        w3.start();
    } catch (Exception e) {
        // TODO: handle exception
    }
}

}

输出结果:
。。。
。。。
。。。
哈东售出一张,剩余23
哈站售出一张,剩余22
哈西售出一张,剩余21
哈东售出一张,剩余20
哈站售出一张,剩余19
哈西售出一张,剩余18
哈东售出一张,剩余17
哈站售出一张,剩余16
哈西售出一张,剩余15
哈东售出一张,剩余14
哈站售出一张,剩余13
哈西售出一张,剩余12
哈东售出一张,剩余11
哈站售出一张,剩余10
哈西售出一张,剩余9
哈东售出一张,剩余8
哈站售出一张,剩余7
哈西售出一张,剩余6
哈东售出一张,剩余5
哈站售出一张,剩余4
哈西售出一张,剩余3
哈东售出一张,剩余2
哈站售出一张,剩余1
哈西售出一张,剩余0