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

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

  • 相关阅读:
    linux查看网卡个数及速度
    win7下设置 WiFi AP
    Scalaz(2)- 基础篇:随意多态-typeclass, ad-hoc polymorphism
    复用的基础是组件化与标准化
    Java & Groovy & Scala & Kotlin
    函数式编程的类型系统:typeclass--Functor的解释--构造类型
    类型构造器-Functor[F[_]]
    类型构造器--高阶类型(构造器):Kind (type theory)--类型的元
    函数的类型:函数也是类型 (*)->*
    应用内存管理三要素
  • 原文地址:https://www.cnblogs.com/cutter-point/p/5943996.html
Copyright © 2011-2022 走看看