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

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

  • 相关阅读:
    P2114 [NOI2014]起床困难综合症(二进制)
    P4577 [FJOI2018]领导集团问题
    P5290 [十二省联考2019]春节十二响(堆+启发式合并)
    P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
    P4890 Never·island(dp)
    P2617 Dynamic Rankings(树状数组套主席树)
    P5241 序列(滚动数组+前缀和优化dp)
    P3243 [HNOI2015]菜肴制作(拓扑排序)
    【LeetCode每天一题】Combination Sum II(组合和II)
    【LeetCode每天一题】Combination Sum(组合和)
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5943996.html
Copyright © 2011-2022 走看看