首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

100分问一个线程同步有关问题,多谢

2012-01-08 
100分问一个线程同步问题,在线等.谢谢!麻烦大家帮我看看,我已经在add上用了同步,为什么还是没效果,输出101

100分问一个线程同步问题,在线等.谢谢!
麻烦大家帮我看看,我已经在add上用了同步,为什么还是没效果,输出1010?
谢谢大家!
class   A
{
        public   static   int   date=1000;//共享资源
}
  class   myThread   extends   Thread
{
                public   int   mydate;
                public   int   sleeptime;
                public   myThread(int   sleeptime,String   name)
                {
                super(name);                
                this.sleeptime=sleeptime;
                }
                public     void   run()
                  {                        
                                                    System.out.println(this.getName()+ "启动 ");
                                                    add();
                                                      System.out.println(this.getName()+ "结束 ");                            
                }
                public   synchronized   void   add()
                {
                  try
                                    {    
                              mydate=A.date;
                              System.out.println(this.getName()+ "的A.date= "+mydate);
                                                Thread.sleep(1000*sleeptime);   //睡眠sleeptime秒
                                                mydate=mydate+10;
                                                A.date=mydate;
                                        }
                                      catch(InterruptedException   ie){   }        


                }
                public   static   void   main(String   args[])
                {                
                                  myThread   t1=new   myThread(6, "线程1 ");
                                  myThread   t2=new   myThread(2, "线程2 ");
                                  t1.start();
                                  t2.start();
                                  try
                                  {       sleep(12000);
                                }catch(InterruptedException   ie){}
                                System.out.println( "开始输出A.date ");
                                  System.out.println(A.date);
              }
}

[解决办法]
同步代码放在myThread 类里了,共享锁分别是myThread t1,myThread t2
所以没有达到同步效果,建议你在myThread放入一个共享变量,如static的
[解决办法]
public synchronized void add()
相当于
public void add(){
synchronized(this)//当前实例,
}
[解决办法]
某一线程add完A.date为1010,另一线程开始输出1010。
A.date在类加载后就已经存在,并不是和A的实例关联的。
[解决办法]
class A
{
public static int date=1000;//共享资源
}
class test extends Thread
{
public int mydate;
public int sleeptime;
A a;
public test(int sleeptime,String name,A a)
{
super(name);
this.sleeptime=sleeptime;
this.a=a;
}
public void run()
{
System.out.println(this.getName()+ "启动 ");
add();
System.out.println(this.getName()+ "结束 ");
}
public synchronized void add()
{
try
{
synchronized(a){
mydate=a.date;
System.out.println(this.getName()+ "的a.date= "+mydate);
Thread.sleep(1000*sleeptime); //睡眠sleeptime秒
mydate=mydate+10;
a.date=mydate;
}
}
catch(InterruptedException ie){ }
}
public static void main(String args[])
{
A a=new A();


test t1=new test(6, "线程1 ",a);
test t2=new test(2, "线程2 ",a);
t1.start();
t2.start();
try
{ sleep(12000);
}catch(InterruptedException ie){}
System.out.println( "开始输出A.date ");
System.out.println(A.date);
}
}

[解决办法]
楼主自己对比下

[解决办法]
对了 我test 里add方法的synchronized 也可以去掉 =》public void add()
[解决办法]
synchronized 修饰方法时候,锁定的对象是 this;
test t1=new test(6, "线程1 ",a);
test t2=new test(2, "线程2 ",a);
t1.start();
t2.start();
锁定的不是同一个对象t1.start(); 锁定的是t1 对象, t2.start(); 锁定的是t2 对象
可以同时执行 t1 data+10之前sleep 6秒 t2 读的是data 的初始值 1000
所以两个打印的都是 1000

[解决办法]
一个更好的处理多个线程共享一个数据源的方式:就是多个线程共享同一个Runnable接口,数据源由Runnable中的run来改变:

public class Synchronize implements Runnable {
public int data;

@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
System.out.println(data++);
} catch(InterruptedException ex) {
System.out.println(ex.getMessage());
}
}
}

public static void main(String[] args) {
Runnable runnable = new Synchronize();
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
}
}

热点排行