日期:2014-05-20  浏览次数:20713 次

下面这段代码为何不能让线程同步?初学多线程,望指导。

public class MyThread extends Thread{
private static int ticketNum = 0;
public MyThread(String name){
super(name);
}
public void run(){
while(ticketNum<1000){
print();
}
}

public synchronized void print(){
MyThread.ticketNum = 1+MyThread.ticketNum;
System.out.println(this.getName()+"卖票一张,编号:\t"+MyThread.ticketNum);
}

}


------解决方案--------------------
顺序不多很正常呀!你启动所有线程后,线程之间是并行关系,时间太快有可能不是升序,只要没有重复即可说明已经实现同步了。
------解决方案--------------------
各个线程实际上都是在不同的实例中执行各自的同步方法,根本就没有形成竞争

用同一个Runnable对象试试
------解决方案--------------------
这样没有同步,4个线程各自运行各自的synchrinized 方法,不存在同步。楼主把后面代码改一下试试:

MyThread mt=new MyThread("mt");
Thread t1=new Thread(mt,"窗口1");// 四个线程运行同一段代码,同步对象是一个mt.
Thread t2=new Thread(mt,"窗口2");
Thread t3=new Thread(mt,"窗口3");
Thread t4=new Thread(mt,"窗口4");

t1.start();
t2.start();
t3.start();
t4.start();

------解决方案--------------------
lz你synchronized 其实锁的是对象而你new了4个对象,所以你肯定锁不住,4个对象之间互不影响。。。
------解决方案--------------------

public class MyThread extends Thread {
private static int ticketNum = 0;

public MyThread(String name) {
super(name);
}

public void run() {
while (ticketNum < 1000) {
print();
}
}

public synchronized void print() {
MyThread.ticketNum = 1 + MyThread.ticketNum;
System.out.println(this.getName() + "卖票一张,编号:\t" + MyThread.ticketNum);
}
public static void main(String[] args) {
new MyThread("").start();
}

}


运行非常正常
------解决方案--------------------
引用:
这样没有同步,4个线程各自运行各自的synchrinized 方法,不存在同步。楼主把后面代码改一下试试:
Java code?12345678910MyThread mt=new MyThread("mt");Thread t1=new Thread(mt,"窗口1");// 四个线程运行同一段代码,同步对象是一个mt.Thread t2=new Thread(mt,……

同意楼上!说的太好了
MyThread mt1 = new MyThread("窗口1");MyThread mt2 = new MyThread("窗口2");MyThread mt3 = new MyThread("窗口3");MyThread mt4 = new MyThread("窗口4");mt1.start();mt2.start();mt3.start();mt4.start();
改成楼上的代码就行了
------解决方案--------------------
其实有个更简单的办法不要锁对象,直接锁类就OK了你在synchronized 前加个static 让他变为静态的锁类就OK了