《Java多线程编程核心技术》读后感(七)
volatile关键字
主要作用是使变量在多个线程间可见。
关键字volatile与死循环
package Second; public class PrintString { private boolean isContinuePrint = true; public boolean isContinuePrint() { return isContinuePrint; } public void setContinuePrint(boolean isContinuePrint) { this.isContinuePrint = isContinuePrint; } public void printStringMethod() { try { while (isContinuePrint == true) { System.out.println("run printStringMethod threadName=" + Thread.currentThread().getName()); Thread.sleep(1000); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package Second; public class Run { public static void main(String[] args) { PrintString printStringService = new PrintString(); printStringService.printStringMethod(); System.out.println("我要停止它!stopThread=" + Thread.currentThread().getName()); printStringService.setContinuePrint(false); } }
解决同步死循环
package Second; public class PrintString implements Runnable { private boolean isContinuePrint = true; public boolean isContinuePrint() { return isContinuePrint; } public void setContinuePrint(boolean isContinuePrint) { this.isContinuePrint = isContinuePrint; } public void printStringMethod() { try { while (isContinuePrint == true) { System.out.println("run printStringMethod threadName=" + Thread.currentThread().getName()); Thread.sleep(1000); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { printStringMethod(); } }
package Second; public class Run { public static void main(String[] args) { PrintString printStringService = new PrintString(); new Thread(printStringService).start(); System.out.println("我要停止它!stopThread=" + Thread.currentThread().getName()); printStringService.setContinuePrint(false); } }
关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值
解决异常死循环
package Second; public class RunThread extends Thread { private boolean isRunning = true; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } @Override public void run() { System.out.println("进入run了"); while (isRunning == true) { } System.out.println("线程被停止了!"); } }
package Second; public class Run { public static void main(String[] args) { try { RunThread thread = new RunThread(); thread.start(); Thread.sleep(1000); thread.setRunning(false); System.out.println("已经赋值为false"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package Second; public class RunThread extends Thread { volatile private boolean isRunning = true; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) { this.isRunning = isRunning; } @Override public void run() { System.out.println("进入run了"); while (isRunning == true) { } System.out.println("线程被停止了!"); } }
volitile非原子特性
package Second; public class MyThread extends Thread { volatile public static int count; private static void addCount() { for (int i = 0; i < 100; i++) { count++; } System.out.println("count=" + count); } @Override public void run() { addCount(); } }
package Second; public class Run { public static void main(String[] args) { MyThread[] mythreadArray = new MyThread[100]; for (int i = 0; i < 100; i++) { mythreadArray[i] = new MyThread(); } for (int i = 0; i < 100; i++) { mythreadArray[i].start(); } } }
package Second; public class MyThread extends Thread { public static int count; synchronized private static void addCount() { for (int i = 0; i < 100; i++) { count++; } System.out.println("count=" + count); } @Override public void run() { addCount(); } }
使用原子类进行i++操作(详见书)
原子类也并不完全安全(详见书)
synchronized代码块有volatile同步的功能
package Second; public class Service { private boolean isContinueRun = true; public void runMethod() { String anyString = new String(); while (isContinueRun == true) { } System.out.println("停下来了!"); } public void stopMethod() { isContinueRun = false; } }
package Second; public class ThreadA extends Thread { private Service service; public ThreadA(Service service) { super(); this.service = service; } @Override public void run() { service.runMethod(); } }
package Second; public class ThreadB extends Thread { private Service service; public ThreadB(Service service) { super(); this.service = service; } @Override public void run() { service.stopMethod(); } }
package Second; public class Run { public static void main(String[] args) { try { Service service = new Service(); ThreadA a = new ThreadA(service); a.start(); Thread.sleep(1000); ThreadB b = new ThreadB(service); b.start(); System.out.println("已经发起停止的命令了!"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package Second; public class Service { private boolean isContinueRun = true; public void runMethod() { String anyString = new String(); while (isContinueRun == true) { synchronized (anyString) { } } System.out.println("停下来了!"); } public void stopMethod() { isContinueRun = false; } }
posted on 2017-11-17 00:06 Michael2397 阅读(349) 评论(0) 编辑 收藏 举报