`
csbison
  • 浏览: 150643 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Process Thread

阅读更多

线程有四种状态:

            1) 创建(new)

            2) 就绪(Runnable)

            3) 阻塞(Blocked)

            4) 结束(Dead)

       

线程在以下情况下,会进入阻塞状态:      

1) 调用sleep()

2) 调用wait()

3) I/O阻塞;因获取其他对象的对象锁而阻塞。

   

        wait notify的使用:

        

wait notify的使用

 

1) 这两个方法都必须是在synchronized代码块或方法中使用。

2) wait一般是自己调用。而别人再进行notify()

 

调用sleep()的时候,锁并没有释放;而wait()方法的确释放了锁。这意味着在调用wait()期间,可以调用线程中对象的其他同步控制方法。

 

 

在多线程并发的情况下,使用yield()这个让步方法。可以让并发更加均衡。

 

 

sleep(),wait(),join()方法都必须进行try...catch,因为都有可能受interrupt所影响。

 

    synchronized注意的地方: 

        

synchronized代码块是对指定的对象进行加锁;synchronized方法是对本身对象进行加锁,等同于synchronized(this){}

所以两者从机制上,没有大的区别。

 

 

注意,互斥只有在竞争者之间才会互斥;即只有争夺共享锁的之间才会互斥。

例如以下代码中,在调用sync1()的时候,同时再调用sync2(),则会互斥。而同时调用notSync()则不会互斥。

package bison.sample;

 

public class SynchronizedDemo {

 

    public synchronized void sync1() {

       try {

           System.out.println("sync1 start sleep...");

           Thread.sleep(10 * 1000);

           System.out.println("sync1 end sleep");

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

    

    public synchronized void sync2() {

       try {

           System.out.println("sync2 start sleep...");

           Thread.sleep(10 * 1000);

           System.out.println("sync2 end sleep");

       } catch (InterruptedException e) {

           e.printStackTrace();

       }

    }

    

    public void notSync(){

        System.out.println("notSync hello");

    }

 

}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics