zoukankan      html  css  js  c++  java
  • 【Effective Java】11、同步访问共享的可变数据

    这段时间看的部分感觉没啥需要记录下来的,个人也没什么想法,不过以后还是要多记,多写

    package cn.xf.cp.ch02.item66;
    
    import java.util.concurrent.TimeUnit;
    
    import org.junit.Test;
    
    public class StopThread
    {
        /**
         * 停止线程变量
         */
        private static boolean stopRequested;
        
        //吧对变量的读和写方法都进行同步
        private static synchronized void requestStop()
        {
            stopRequested = true;
        }
        
        private static synchronized boolean stopRequested()
        {
            return stopRequested;
        }
        
        /**
         * 停止线程变量,这个使用关键字volatile使每个线程都是获取到最新的值
         */
        private static volatile boolean stopRequested2;
        
        @Test
        public void test()
        {
            Thread backgroundThread = new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    int i = 0;
                    while(!stopRequested())
                    {
                        ++i;
                    }
                }
            });
            //启动线程
            backgroundThread.start();
            
            //休眠1秒
            try
            {
                TimeUnit.SECONDS.sleep(1);
            }
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            requestStop();
        }
        
        @Test
        public void test2()
        {
            Thread backgroundThread = new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    int i = 0;
                    System.out.println("这里使用最新的stopRequested2值");
                    while(!stopRequested2)
                    {
                        ++i;
                    }
                }
            });
            
            //启动线程
            backgroundThread.start();
            
            //停下1s之后执行变量修改程序
            try
            {
                TimeUnit.SECONDS.sleep(1);
            }
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //修改变量
            stopRequested2 = true;
        }
        
        
        public static void main(String[] args) throws InterruptedException
        {
            Thread backgroundThread = new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    int i = 0;
                    System.out.println(stopRequested); //false
                    //这里停不下来是因为主线程对stopRequest进行修改的时候,这个线程并不可见
                    while(!stopRequested)
                    {
                        ++i;
                    }
                }
            });
            //启动线程
            backgroundThread.start();
            
            //休眠1秒
            TimeUnit.SECONDS.sleep(1);
            stopRequested = true;
        }
    }

    这个main方法是永远不停的,其余两个从两个不同的角度给出了同步的方法

    总之:当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步。

  • 相关阅读:
    npm ci命令比npm installer命令快2至10倍
    Liferay 7.1发布啦
    2016/07/05 zend optimizer
    2016/06/16 phpexcel
    2016/06/13 phpexcel 未完待续
    2016/06/10 日历插件 Datepicker
    2016/06/09 ThinkPHP3.2.3使用分页
    2016/06/02 网摘记录 svn 服务器端 客户端 安装使用
    2016/05/27 php上传文件常见问题总结
    2016/05/25 抽象类与API(接口)差别
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5943996.html
Copyright © 2011-2022 走看看