线程零碎的小知识

线程可见性

1.可见性

一个线程对共享变量值得修改,能够及时的被其他线程看到

2.共享变量

如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量

3.规定

线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主线程中获取。
不同线程中间无法访问其他线程中作内存中的变量,线程间变量值得传递需要通过主内存来完成

4.共享变量可见性实现原理

线程1对共享变量的修改想要被线程2及时看到,必须经过如下2步操作:
把工作内存1中的更新过的共享变量刷新到主内存中;
将主内存中最新的共享变量的值更新到2的工作内存中

5.要实现共享变量的可见性,必须保证两点:
线程修改后的共享变量值能够及时从工作内存刷新到主内存中;
其他线程能够及时的把共享变量的最新值从主内存更新到自己的工作内存中。

6.Java语言层面支持的可见性实现原理方式:

    synchronize

    volatile

 

线程的生命周期及状态

在线程的生命周期中,它要经过 新建(New)、就绪(Runnable)、运行(Running)、阻塞(Bolcked)、死亡(Dead)总共5种状态

就绪状态:当线程对象调用了start()方法之后,该线程就处于就绪状态,就绪状态相当于"等待执行"。java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示线程可以运行,但是进入运行状态取决于JVM里线程调度器的调度。如下情况会进入就绪状态;

1.调用sleep()方法到了指定的时间。

2.线程调用的阻塞式IO方法已经返回。

3.线程成功地获得了试图取得的同步监视器。

4.线程正在等待某个通知时,其它线程发出了一个通知。

5.处于挂起状态的线程被调用了resume()恢复方法。

  PS:启动线程使用 start()方法,不是run()方法!!永远不要调用线程对象的run()方法!调用  start()方法,系统会把run()方法当成线程执行体来处理。直接调用run()方法,则run()方法会立即被执行,系统会把线程对象当成一个普通对象来处理,run()方法也变成了一个普通的方法。只能对处于新建状态的线程调用start()方法,否则会引发IllegalThreadStateException异常

运行状态处于就绪状态的线程获得了CPU的执行权,开始执行run()方法的线程执行体,则该线程处于运行状态。

阻塞状态:发生以下几种情况,线程会进入阻塞状态:

1.线程调用了sleep()方法,主动放弃所占用的系统资源。

2.线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。

3.线程试图获得一个同步同步监视器,但该同步监视器被其它线程所持有。

4.线程正在等待某个通知(notify或notifyAll)。

5.程序调用了线程的suspend()方法将该线程挂起,但该方法会导致死锁,要避免使用。

 

posted @ 2018-05-05 09:47  老黄Hwy  阅读(167)  评论(0)    收藏  举报