当前位置: 代码迷 >> Java相关 >> 线程的问题
  详细解决方案

线程的问题

热度:120   发布时间:2009-11-18 19:26:32.0
线程的问题
学习线程了,可是很不理解,高手请指点
public class TextDeadLock implements Runnable{
    public  void add(int x,int y){
      synchronized(this){
        int z=x+y;
        System.out.println(z);
        }
    }
   
   
   


    /**
    * @param args
     * @throws InterruptedException
    */
    public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
    TextDeadLock td1 = new TextDeadLock();

    Thread t1 = new Thread(td1);
    Thread t2 = new Thread(td1);
    t1.start();
    t2.start();
    }

    public void run() {
     
        add(10,20);   
    }
    }

这是同一个对象在不同的线程里运行的吧,这时候不应该先获得对象锁的才能调用方法吗,可是运行后事两个一起出来的,是我理解错误吧。
搜索更多相关的解决方案: 线程  

----------------解决方案--------------------------------------------------------
对synchronized(this)的一些理解
  一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
  二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
  三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
  四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
  五、以上规则对其它对象锁同样适用

可能是CUP的处理速度太快了肉眼分辨不出来,你看看那加入一个较长的FOR 循环看看。
----------------解决方案--------------------------------------------------------
你可以设一个运行的时间
----------------解决方案--------------------------------------------------------
  相关解决方案