java线程状态转换/同步与锁

晨曦之光 发布于 2012/05/16 17:05
阅读 279
收藏 1

Java线程的转换:

                线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。

                         1、  新状态:线程对象已经创建,还没有调用start()方法

                         2、  可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程所处的状态。

                         3、  运行状态:线程调度程序从可运行池中选择一个线程座位当前线程时线程所处的状态。

                        4、  等待、阻塞,睡眠状态:这是线程有自个运行时他所处的状态(线程仍旧是活的,但是当前没有条件运行

                        5、  死亡态:当线程的run()方法完成时就认为他死去啦。线程死亡就不能复生。)

               组织线程执行:

                       1睡眠:

                                   Thread.sleep(long millis)和Thread.sleep(longmillis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠                                    时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。为了让其他线程有机会执行,可以将                                          Thread.sleep()的调用放线程run()之内。这样可以保证该线程执行过程中睡眠。

                                    线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。

                       2 线程的优先级和线程让步yield():

                                   线程的让步是通过Thread.yield()实现的。Yield()方法的作用是:暂停当前正在执行的线程对象,并执行其他线程。线程是存在优先级的,大多数                                   当前运行的线程优先级大于或等于线程池中任何线程的优先级。当线程池中的线程具有相同的优先级,可以选择一个线程运行,知道他阻塞或运                                   行完成为止,或者时间分片,为池内的每个线程提供均等的运行机会。

                       3 Thread.yield()方法

                                  Thread.yield()方法的作用是:暂停当前正字执行的线程对象,并执行其他线程。

                       4 join()方法:

                                  Thread的非静态方法join()让一个线程B加入到另外一个线程A的尾部。在A执行完毕之前,B不能工作。另外,join()方法还有带超时限制的                                   重载文本,例如t.join(5000),则让线程等待5000毫秒,入锅超出这个时间,则停止等待,变为可运行状态。

Java线程的同步与锁:

          锁的原理:

                 Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法时,自动获得与正在执行代码类的当前事例有关的锁,当程序运行到                           synchronized同步方法或代码块时该对象锁才起作用。一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,知道第一个                   线程释放锁。

         锁和同步的几个要点:

                      (1)      只能同步方法而不能同步变量和类;

                      (2)      每个对象只有一个锁,当提到同步时,应该清楚在什么上面同步

                      (3)      不必同步类中所有的方法,类可以同时拥有同步和非同步方法

                      (4)      如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,里一                           个需要等待,知道锁被释放

                       (5)      如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制

                        (6)      线程睡眠时,他所持的任何锁都不会释放

                        (7)      线程可以获得多个锁,如果一个对象的同步方法里调用另外一个对象同步方法,则获得了两个对象的同步锁

                       (8)      在使用同步代码块时,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁                                                                                              

         静态方法同步

                      要同步静态方法,需要一个用整个类对象的锁,这个对象就是这个类(***.Class)

         线程不能获得锁会怎么样:

                     如果线程师徒进入同步方法,而其锁已经被占用,则线程在该对象上被阻塞

         阻塞时要注意哪个对象背用于锁定:

                    1调用同一个对象中非静态同步方法的线程将彼此阻塞。如果是不同对象,则每个线程有自己的对象的锁,线程间彼此互不干预。

                    2调用同一个类中的静态同步方法的线程将彼此阻塞,它们都是锁定在相同的Class 对象上。

                    3  静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定在Class 对象上,非静态方法锁定在该类的对象上。

                   4  对于同步代码块,要看清楚什么对象已经用于锁定(synchronized后面括号的内容)。在同一个对象上进行同步的线程将彼此阻塞,在不同对象上锁                     定的线程将永 远不会彼此阻塞。

         线程死锁:

                 死锁对于Java程序来说是很复杂的,也很难发现问题,当两个线程被阻塞,每个线程在等待另一个线程时就发生死锁。死锁是线程间相互等待锁锁造成                     的,在实际中发生的概率非常的小。真让你写个死锁程序,不一定好使,但是,一旦程序发生死锁,程序将死掉。    

 

 

 

 

 

 

 

 


原文链接:http://blog.csdn.net/xy849288321/article/details/6754540
加载中
返回顶部
顶部