zoukankan      html  css  js  c++  java
  • 《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;
        }
    }

  • 相关阅读:
    Asp.net 文件下载,中文文件名出现乱码
    存储过程中执行动态Sql语句
    SQLServer : EXEC和sp_executesql的区别
    C# 从服务器下载文件代码
    在windows 7 上为 sqlserver 2008 启用远程访问
    数字求和
    大道至简第一章读后感
    作业
    SharePoint2013 App 开发中 自定义网站栏,内容类型,列表。
    SharePoint2013 App开发模式
  • 原文地址:https://www.cnblogs.com/Michael2397/p/7847398.html
Copyright © 2011-2022 走看看