public class Test {
public static void main(String[] args){
test1 a=new test1("a");
test1 b=new test1("b");
a.start();
b.start();
    }
}
class test1 extends Thread{
test1(String s){
super(s);
}
public synchronized void run(){
for(int i=0;i<10;i++)
{
System.out.print(getName()+"1+");
try {
sleep(500);
System.out.print(getName()+"2+");
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}
这是一个线程同步的程序本想将RUN()设成a调用时b无法调用
按理应该是输出a1+a2+b1+b2+....
可是程序仍无法同步不知道哪出错了

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【fwz1028】截止到2008-07-22 21:18:09的历史汇总数据(不包括此帖):
    发帖的总数量:1                        发帖的总分数:0                        每贴平均分数:0                        
    回帖的总数量:0                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:0                        
    结贴的百分比:0.00  %               结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    你的Thread.sleep调用后,目前线程对cpu的占用就暂时结束了,所以synchoronized 锁也就打开了,那么thread b当然就可以使用时间片了。你如果想要a调用时b不能调用就直接把Thread.sleep去掉,那么因为锁的存在,线程a只要进入了run函数,那么线程b就没有机会执行了除非a结束
      

  3.   

    这一句有问题吧public synchronized void run()
      

  4.   

    LZ要明白互斥锁的概念和临界区的概念.实现互斥访问的机制有很多种,Java中常用的就是使用互斥锁.互斥锁,就是,当某个线程访问互斥资源的时候,先去竞争它的互斥锁(这个互斥锁,操作系统保证同一时刻只能由一个线程拿到),然后,对该互斥资源上锁,其他线程由于该资源的锁已经被使用了,所以只能等待该锁被释放之后再去竞争.
    Java当中,可以使用synchronized关键字来实现这种访问方式.一共有三种方式:第一种,Object lock = new Object();
    //在某个代码段中插入
    synchronized (lock){
    //在这个区域的代码是被互斥保护的.但是,要注意,所有参与互斥访问的线程,拿到的是同一个lock对象.
    }第二中,//作用在对象的方法上
    public synchronized void function(){
    //方法体中的代码会被互斥保护.但是,要注意,该方式的lock是对象本身.
    }这种方式,等同于public void function(){
    synchronized(this){
    //添加方法体内容
    }
    }第三种,//作用在静态方法上
    public static synchronized void function(){
    //方法体中的代码会被互斥保护.但是,要注意,该方式的lock是该类对应的Class对象.
    }楼主的那个public sychronized void run(){}锁只加在了相应的test1的对象上了,那么,a和b两个线程,a线程竞争的是a的锁,b线程竞争的是b的锁.所以,它们并没有竞争同一个资源的锁.每个线程对象只把自己当作互斥资源,其实,它们彼此是相互独立的.3楼说的那个用法,其实,是符合语法规则的一种用法,只不过,每个线程对象只把自己当作互斥资源,该线程的整个执行周期里,其他线程是无法获得该线程的锁的.
    实际上,我们是不常这么使用的.一般,我们会自己创建一个互斥资源,把操作互斥资源的代码用synchrozized保护起来,要注意这时的lock一定是互斥资源.