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方法是永远不停的,其余两个从两个不同的角度给出了同步的方法

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

  • 相关阅读:
    MongoDB学习笔记~Mongo集群和副本集
    知方可补不足~写了一个计算数据表占用存储空间的方法
    MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法
    MongoDB学习笔记~索引提高查询效率
    MongoDB学习笔记~客户端命令行的使用
    Android动画效果translate、scale、alpha、rotate详解
    CacheHelper工具类的使用
    [置顶] vs2008 编译adb 支持4.2 android 系统(增加push 命令的进度)
    如何在cocos2d项目中enable ARC
    敏捷开发用户故事系列之十一:CSDN博客用户故事分析
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5943996.html
Copyright © 2011-2022 走看看