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