对JAVA多线程 并发编程的理解

来源:互联网 发布:阿里巴巴与淘宝价格比 编辑:程序博客网 时间:2024/05/18 14:25
对JAVA多线程并发编程的理解


Java多线程编程关注的焦点主要是对单一资源的并发访问,本文从Java如何实现支持并发访问的角度,浅析对并发编程的理解,也算是对前段时间所学的一个总结。


线程状态转换
Java语言定义了5中线程状态,在任何一个时间点,一个线程只能有且只有其中一种状态,这5中状态分别是:


�0�1  新建(New):创建后尚未启动的线程处于这种状态


�0�1  运行(Runable):Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能正在执行,也有可能正在等待CPU为它分配执行时间


�0�1  无限期等待(Waiting):处于这种状态的线程不会被分配CPU执行时间,他们要等待被其他线程显式的唤醒。以下方法会让线程陷入无限期的等待状态:


u  没有设置Timeout参数的Object.wait()方法。


u  没有设置Timeout参数的Thread.join()方法。


u  LockSupport.park()方法。


�0�1  限期等待(TimedWaiting):处于这种状态的线程也不会被分配CPU执行时间,不过无须等待被其他线程显式地唤醒。在一定时间这后它们会由系统自动唤醒。以下方法会让线程进行限期等待状态:


Thread.sleep()方法。


u  设置了Timeout参数的Object.wait()方法。


u  设置了Timeout参数的Thread.join()方法。


u  LockSupport.parkNanos()方法


u  LockSupport.parkUntil()方法


�0�1  阻塞(Blocked):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态“在等待着获取到一个排它锁,这个事件将在另外一个线程放弃这个锁的时候发生:而”等待状态“则是在等待一段时间,或都唤醒动作的发生。在程序等待进入同步区域的时候,线程将进入这种状态。


�0�1  结束(Terminated):已终止线程的线程状态,线程已经结束执行。


各种状态转换如下图:






资源监视器
在进行多线程并发操作时,关键的任务是如何保证在并发的多个线程中对竞争资源的安全访问。所谓安全访问是指一个线程正在在竞争性资源操作(会修改资源的状态)时,其它线程不能对该竞争性资源进行操作(如果所有线程都是对该资源进行读操作,则不会产生安全性问题)。


Java为解决此类问题,提出了监视器的概念。形象的讲,一个资源的监视器,好比是在要访问的资源上包了一层安全防护壳,如下图:






Java虚拟机保证,在同一时间点上,有且只会有一个线程获得该资源的监视器。换句话说,也是获得了该资源的锁。获得锁的线程可以进行后续操作,没有获得锁的线程则只能进行等待或阻塞。


一个已经获得该资源的监视器的线程,后续还可以多次获得该监视器,每获得一次,锁计数会加1,每退出一次资源监视器,锁计数也相应的减1。等到线程完全退出了该资源监视器,锁计数也清零了。此时,其他线程就可以获得该资源的监视器了。


Java监视器支持两种线程,互斥和协作。Java虚拟机通过对象锁来实现互斥,允许多个线程在一个共享数据上独立而互不干扰地工作。协作是通过Object类的wait方法和notify方法来实现,允许多个线程为了同一个目标而共同工作。


互斥可以在多线程中互斥地执行一段被称作监视区域的代码,在任务时候,特定监视器上只有一个线程执行监视区域。通常,互斥只在多个线程需要共享数据或其他资源时显得重要,如果两个线程并不使用任务公有数据或资源,它们通常会互不干扰,也就不需要进行互斥执行。


互斥帮助线程在访问共享数据时不被其他线程干扰,而协作帮助线程与其他线程共同工作。


当一个线程需要一些特别状态的数据,而由另一个线程负责改变这些数据的状态时,协作就显得非常重要。生产者和消费者就是这样一个例子。一个”读线程“会从数据缓冲区中读取数据,而另一个”写线程”会向数据缓冲区中写入数据。读线程缓冲区处理”非空“状态时才能读数据。如果读线程发现数据缓冲区是空的,它就必须等待。


Java提供”等待并唤醒“的方式来支持多线程的协作行为。对应到Java API上就是Object对象的wait()/notify()/notifyAll()方法。


wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。


  当前的线程必须拥有当前对象的monitor,也即lock,就是锁。


  线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll()方法),这样它才能重新获得锁的拥有权和恢复执行。


  要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或synchronized块中。


  一个小比较:


  当线程调用了wait()方法时,它会释放掉对象的锁。


另一个会导致线程暂停的方法:Thread.sleep(),它会导致线程睡眠指定的毫秒数,但线程在睡眠的过程中是不会释放掉对象的锁的。


notify()方法会唤醒一个等待当前对象的锁的线程。


  如果多个线程在等待,它们中的一个将会选择被唤醒。这种选择是随意的,和具体实现有关。(线程等待一个对象的锁是由于调用了wait方法中的一个)。


  被唤醒的线程是不能被执行的,需要等到当前线程放弃这个对象的锁。


  被唤醒的线程将和其他线程以通常的方式进行竞争,来获得对象的锁。也就是说,被唤醒的线程并没有什么优先权,也没有什么劣势,对象的下一个线程还是需要通过一般性的竞争。


  notify()方法应该是被拥有对象的锁的线程所调用。


  (Thismethod should only be called by a thread that is the owner of this object'smonitor.)


  换句话说,和wait()方法一样,notify方法调用必须放在synchronized方法或synchronized块中。


前面说wait、nofity、notifyAll方法被调用时,应确保在调用的对象上已经获得了该对你的监视器。即该线程操作该对象的锁。


一个线程变为一个对象的锁的拥有者是通过下列三种方法:


  1.执行这个对象的synchronized实例方法。


  2.执行这个对象的synchronized语句块。这个语句块锁的是这个对象。


  3.对于Class类的对象,执行那个类的synchronized、static方法。

http://lvyou.baidu.com/plan/a8b4f46581179a2b3d25ced9
http://lvyou.baidu.com/plan/55c0033ed03f051bc397dad9
http://lvyou.baidu.com/plan/6b02d1c4698330d277ea82d9
http://lvyou.baidu.com/plan/7b58afbffc2eb093dc3e8bd8
http://lvyou.baidu.com/plan/19d54dd1dcf68142aa3ebecf
http://lvyou.baidu.com/plan/0800f08028ff3b29977e98d8
http://lvyou.baidu.com/plan/369ab0dd6d276de091734bcf
http://lvyou.baidu.com/plan/9b7564281b92a6434a3a50cf
http://lvyou.baidu.com/plan/4f47e11d3c245428399856cf
http://lvyou.baidu.com/plan/fe49df42aa3e06d202e340d8
http://lvyou.baidu.com/plan/d0f7ab5c2b2c901a6b0a10cf
http://lvyou.baidu.com/plan/318238cdb4e3face1f8468d8
http://lvyou.baidu.com/plan/15983c27479f11d463b41ecf
http://lvyou.baidu.com/plan/fb58247acffc6931e5216fd8
http://lvyou.baidu.com/plan/2c79b27c52b7ba1bb4ea23cf
http://lvyou.baidu.com/plan/269de8075754f03b0f6476d8
http://lvyou.baidu.com/plan/e30f7718e63a1e21111ce8cd
http://lvyou.baidu.com/plan/f4df3140a7d0eb18f30436ce
http://lvyou.baidu.com/plan/4159c2cfb6d8b30d14cfefcd
http://lvyou.baidu.com/plan/017595c3e4bee2ab9d15b7c9
http://lvyou.baidu.com/plan/9b7364281b92a6434a3a50c9
http://lvyou.baidu.com/plan/0536a23998c4a2b5d3b85ac9
http://lvyou.baidu.com/plan/d5ee253d66cdb4e3face67c9
http://lvyou.baidu.com/plan/0c360cd923b05dd395301aa2
http://lvyou.baidu.com/plan/3d16b518f304fbb10d5738a1
http://lvyou.baidu.com/plan/667753575ae9687ebd253ba1
http://lvyou.baidu.com/plan/017262a9010f6bcc760c07c8
http://lvyou.baidu.com/plan/19a2413264badb6e6426c6a0
http://lvyou.baidu.com/plan/20273fe71809aa658117cca0
http://lvyou.baidu.com/plan/1ba3df179a2b3d25628dcfa0
http://lvyou.baidu.com/plan/2643fc5ff55c2b2c901a0fc8
http://lvyou.baidu.com/plan/2b89840e70f352d923b018c8
http://lvyou.baidu.com/plan/db2fcff09ccfb6d8b30dee46
http://lvyou.baidu.com/plan/dc3c8c74140f90f09ccfec46
http://lvyou.baidu.com/plan/848b968f250ef993e0082b6e
http://lvyou.baidu.com/plan/44867a0ef993e008a2ae2c6e
http://lvyou.baidu.com/plan/ab07a693e008a2ae44da2d6e
http://lvyou.baidu.com/plan/769abf08a2ae44da9e172e6e
http://lvyou.baidu.com/plan/64f8ec0d14cfc6c65ce5f146
http://lvyou.baidu.com/plan/58e7bc47f2beae8028ff966d
http://lvyou.baidu.com/plan/78e3c3407b3d66cdb4e36646
http://lvyou.baidu.com/plan/2cecebe3face1f8496206946
http://lvyou.baidu.com/plan/ffc2a5ce1f8496208f786a46
http://lvyou.baidu.com/plan/b6ef408496208f78aae76b46
http://lvyou.baidu.com/plan/d801d078aae77a7acffc6d46
http://lvyou.baidu.com/plan/2994d133be8f8ae781239e6d
http://lvyou.baidu.com/plan/82294deeca9bfee1d03aa26d
http://lvyou.baidu.com/plan/c1dd7cfd4d3d68299df17c46
http://lvyou.baidu.com/plan/7ddc123d68299df139037d46
http://lvyou.baidu.com/plan/fcd06603a9d51e5f9d620046
http://lvyou.baidu.com/plan/f843fe2fbd1868dd3ca90446
http://lvyou.baidu.com/plan/da3937dd3ca9010f6bcc0646
http://lvyou.baidu.com/plan/f9a1c215d1d002e1397dba6d
http://lvyou.baidu.com/plan/ccda5de1397d13d1dcf6bc6d
http://lvyou.baidu.com/plan/55885e0f6bcc760c8e0b0846
http://lvyou.baidu.com/plan/4ed4add51c0cfcf11b324775
http://lvyou.baidu.com/plan/0800c2f13903a9d51e5f7f4e
http://lvyou.baidu.com/plan/da3137dd3ca9010f6bcc064e
http://lvyou.baidu.com/plan/55805e0f6bcc760c8e0b084e
http://lvyou.baidu.com/plan/d89f08de38e2d969a4da5f75
http://lvyou.baidu.com/plan/eb3360c29c407b3d66cd6575
http://lvyou.baidu.com/plan/2cdfebe3face1f8496206975
http://lvyou.baidu.com/plan/3b12bc809523b1641f32c34d
http://lvyou.baidu.com/plan/cd93846e642665c98ee1c84d
http://lvyou.baidu.com/plan/1e18c8bf40c170d551261475
http://lvyou.baidu.com/plan/08c70e26da0e70f352d91775
http://lvyou.baidu.com/plan/2ecb7cb05dd3953062271b75
http://lvyou.baidu.com/plan/cfce4709aa6581179a2bcd4d
http://lvyou.baidu.com/plan/842f8d8a4a3429a62918e54d
http://lvyou.baidu.com/plan/d69f42efd8d727c210d9d374
http://lvyou.baidu.com/plan/86d4c5f7350d41451799904d
http://lvyou.baidu.com/plan/90f70e5be97d5d3ed03fd874
http://lvyou.baidu.com/plan/bb099c97bce7cb8b90e4dd74
http://lvyou.baidu.com/plan/54a977ff3b29977e53e2994d
http://lvyou.baidu.com/plan/33421d06d28a4a3429a6e474
http://lvyou.baidu.com/plan/1598153429a62918e63ae674
http://lvyou.baidu.com/plan/64caec0d14cfc6c65ce5f174
http://lvyou.baidu.com/plan/c9188c642cf7a6e24710ab4d
http://lvyou.baidu.com/plan/a159f6dd3a281b92a6434f4d
http://lvyou.baidu.com/plan/514898f83d0018dbcbc3b474
http://lvyou.baidu.com/plan/ec92c78d57de38e2d9695e4d
http://lvyou.baidu.com/plan/7ac88669a4dafa28ad21614d
http://lvyou.baidu.com/plan/1cf2667d13d1dcf68142bd74
http://lvyou.baidu.com/plan/7b73fed67e22b6075754744d
http://lvyou.baidu.com/plan/280c850e70f352d923b0184d
http://lvyou.baidu.com/plan/eb3260c29c407b3d66cd6574
http://lvyou.baidu.com/plan/fff0a5ce1f8496208f786a74
http://lvyou.baidu.com/plan/76b9bf08a2ae44da9e172e4d
http://lvyou.baidu.com/plan/ee140854f03b0f64fefd7774
http://lvyou.baidu.com/plan/f754e225c06744ecefb13e4d
http://lvyou.baidu.com/plan/c9e3d1e161e71809aa65cb4c
http://lvyou.baidu.com/plan/874f742c901a6b0a97bf1174
http://lvyou.baidu.com/plan/60274bcfc6c65ce51797f24c
http://lvyou.baidu.com/plan/fb653040a7d0eb18f3043674
http://lvyou.baidu.com/plan/28386225628d1defd8d7d173
http://lvyou.baidu.com/plan/cfb0a1e1d03abd43fb93a44c
http://lvyou.baidu.com/plan/bb089c97bce7cb8b90e4dd73
http://lvyou.baidu.com/plan/a9c918101ca0dfbe726eae4c
http://lvyou.baidu.com/plan/d2324e1cd374140f90f0eb73
http://lvyou.baidu.com/plan/64cbec0d14cfc6c65ce5f173
http://lvyou.baidu.com/plan/33fa83f68142aa3e06d2bf4c
http://lvyou.baidu.com/plan/67c052575ae9687ebd253b16
http://lvyou.baidu.com/plan/3627a3f11b32eedd6d27494c
http://lvyou.baidu.com/plan/3b4abc809523b1641f32c315
http://lvyou.baidu.com/plan/a158f6dd3a281b92a6434f4c
http://lvyou.baidu.com/plan/40c4e01d3c2454283998564c
http://lvyou.baidu.com/plan/e369b93a1e21111cd374e915
http://lvyou.baidu.com/plan/64a9ec0d14cfc6c65ce5f115
http://lvyou.baidu.com/plan/6f71ddf97ce8cedd1cbefc15
http://lvyou.baidu.com/plan/129e37299df13903a9d57ec4
http://lvyou.baidu.com/plan/fbd53040a7d0eb18f30436c4
http://lvyou.baidu.com/plan/61c41becefb19f3be380c0c3
http://lvyou.baidu.com/plan/7a6a73d6f91e093fb200f812
http://lvyou.baidu.com/plan/6f74ddf97ce8cedd1cbefc12
http://lvyou.baidu.com/plan/7a92aebffc2eb093dc3e8b12
http://lvyou.baidu.com/plan/84a58d8a4a3429a62918e5c3
http://lvyou.baidu.com/plan/99d09a32d3642cf7a6e2aa12
http://lvyou.baidu.com/plan/f8458f3abd43fb933325a5c3
http://lvyou.baidu.com/plan/1c94667d13d1dcf68142bd12
http://lvyou.baidu.com/plan/28816225628d1defd8d7d1cc
http://lvyou.baidu.com/plan/6d955a1bc397bce7cb8bdccc
http://lvyou.baidu.com/plan/d28b4e1cd374140f90f0ebcc
http://lvyou.baidu.com/plan/166b959bfee1d03abd43a3e2
http://lvyou.baidu.com/plan/d7bfe243fb93332592a5a6e2
http://lvyou.baidu.com/plan/7aebc262a12fbd1868dd03d3
http://lvyou.baidu.com/plan/f8d6fe2fbd1868dd3ca904d3
http://lvyou.baidu.com/plan/daac37dd3ca9010f6bcc06d3
http://lvyou.baidu.com/plan/99209a32d3642cf7a6e2aae2
http://lvyou.baidu.com/plan/6bbb34cc760c8e0b173e09d3
http://lvyou.baidu.com/plan/c9b78c642cf7a6e24710abe2
http://lvyou.baidu.com/plan/a96718101ca0dfbe726eaee2
http://lvyou.baidu.com/plan/1bc2adbeae8028ff3b2997e1
http://lvyou.baidu.com/plan/c0cdf5e77a7acffc69316ed2
0 0