• 2.3.7synchronized代码块有volatile同步的功能


    关键字synchronized可以使多个线程访问同一个资源具有同步性,而且他还具有将线程工作内存中的私有变量与公共内存中的变量同步的功能。

    package com.cky.thread;
    
    /**
     * Created by edison on 2017/12/9.
     */
    public class Service {
        private boolean isContinueRun = true;
        public void runMethod() {
            while(isContinueRun == true) {
    
            }
            System.out.println("停下来了");
        }
        public void stopMethod() {
            isContinueRun = false;
        }
    }
    

      

    package com.cky.thread;
    
    /**
     * Created by edison on 2017/12/8.
     */
    public class ThreadA extends  Thread{
    
        private Service service;
        public ThreadA (Service service) {
            this.service = service;
        }
    
        @Override
        public void run() {
            super.run();
            service.runMethod();
        }
    }
    

      

    package com.cky.thread;
    
    /**
     * Created by edison on 2017/12/8.
     */
    public class ThreadB extends  Thread{
    
        private Service service;
        public ThreadB (Service service) {
            this.service = service;
        }
    
        @Override
        public void run() {
            super.run();
            service.stopMethod();
        }
    
    }
    

      

    package com.cky.test;
    
    import com.cky.thread.Service;
    import com.cky.thread.ThreadA;
    import com.cky.thread.ThreadB;
    
    /**
     * Created by edison on 2017/12/9.
     */
    public class Run {
        public static void main(String[] args) {
            try {
                Service service = new Service();
                ThreadA threadA = new ThreadA(service);
                threadA.start();
                Thread.sleep(2000);
                ThreadB threadB = new ThreadB(service);
                threadB.start();
                System.out.println("已经发起停止的命令");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }
    

      

    已经发起停止的命令
    

      以-server服务器模式运行得到死循环

    得到上面结果的原因是各个线程间的数据值没有可视性造成的。而关键字synchronized具有可视性。

    更改Service.java代码

    package com.cky.thread;
    
    /**
     * Created by edison on 2017/12/9.
     */
    public class Service {
        private boolean isContinueRun = true;
        public void runMethod() {
            String anything =new String();
            while(isContinueRun == true) {
                    synchronized (anything) {
                        
                    }
            }
            System.out.println("停下来了");
        }
        public void stopMethod() {
            isContinueRun = false;
        }
    }
    

      

    已经发起停止的命令
    停下来了
    

      

    关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法或者某一个代码块

    他包含了两个特性,互斥性和可见性,同步synchronized不仅可以解决一个线程看到的对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程

    都看到由同一个锁保护之前的修改效果。

  • 相关阅读:
    Windows下IntelliJ IDEA中调试Spark Standalone
    Java中final修饰符深入研究
    Java对象创建过程补遗
    SpringMVC项目中获取所有URL到Controller Method的映射
    简述Java中Http/Https请求监听方法
    WPF浏览器应用程序与JS的互调用(不用WebBrowser)
    通讯协议序列化解读(一) Protobuf详解教程
    Protobuf3语法详解
    ReflectASM-invoke,高效率java反射机制原理
    FFMPEG指令
  • 原文地址:https://www.cnblogs.com/edison20161121/p/8011219.html
Copyright © 2020-2023  润新知