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+....
可是程序仍无法同步不知道哪出错了
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+....
可是程序仍无法同步不知道哪出错了
楼主【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
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一定是互斥资源.