Java多线程学习 (四) volatile变量与线程类中的方法

(一)使用volatile来修饰变量,是为了在多线程环境下一个线程修改了这个变量的值,另外的线程再读取这个变量时能够马上体现出修改后的值,而不是从自己的缓存中读取这个变量的值。

但使用volatile时,注意和static一起使用,保证多个Thread下这个变量时唯一的。例如下面的代码中,没有使用static来修饰,t1修改state的值以后,t2中的并没有改变,所以记得要加上static关键字

 

package TestThread; public class TestVolatile { /** * @param args */ public static void main(String[] args) { TestVol t1 = new TestVol(); TestVol t2 = new TestVol(); t1.start(); t2.start(); t1.state=false; } } class TestVol extends Thread{ volatile boolean state=true; public void run(){ while(true){ System.out.println(Thread.currentThread().getName()+"----"+state); } } } 

 

(二)一个线程在new以后,但没有调用start()方法之前,isAlive()返回的任然是false,wait,sleep等状态返回true,run方法里面的程序体执行完以后,isAlive返回false。

 

(三)线程的run方法体执行完以后,线程类里面定义的方法还是可以执行的。如下面的代码,run方法执行完以后,say()方法还是可以继续执行的。

public class ThreadTest001 { public static void main(String[] args) { // TODO Auto-generated method stub Test003 t001 = new Test003(); t001.start(); while(true){ try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(t001.isAlive()); t001.say(); } } } class Test003 extends Thread{ public void run(){ for(int i=0;i<=10;i++){ try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("run ----"+i); } } public void say(){ System.out.println("======"); } } 

你可能感兴趣的:(Java多线程学习 (四) volatile变量与线程类中的方法)