zoukankan      html  css  js  c++  java
  • Java 学习笔记之 实例变量与线程安全

    实例变量与线程安全:

    不共享数据:

    public class NoSharedThread extends Thread {
        private int count = 5;
    
        public NoSharedThread(String name){
            super();
            this.setName(name);
        }
    
        @Override
        public void run() {
            super.run();
            while (count > 0){
                count--;
                System.out.println("Thread name: " + Thread.currentThread().getName() + ", count: " + count);
            }
        }
    }
    
    
    public class ThreadRunMain {
        public static void main(String[] args) {
            testSharedSafeThead();
        }
    
        public static void testNoSharedThread() {
            NoSharedThread a = new NoSharedThread("a");
            NoSharedThread b = new NoSharedThread("b");
            NoSharedThread c = new NoSharedThread("c");
            a.start();
            b.start();
            c.start();
        }
    
    }

    运行结果:

    可见线程之间没有互相干扰,都在操作自己的count变量。

    共享数据:

    public class SharedThread extends Thread{
        private int count = 5;
        public SharedThread(String name) {
            super();
            this.setName(name);
        }
    
        @Override
        public void run() {
            super.run();
            count--;
            System.out.println("Thread name: " + Thread.currentThread().getName() + ", count: " + count);
        }
    }
    
    public class ThreadRunMain {
        public static void main(String[] args) {
            testSharedThead();
    
        }
    
    public static void testSharedThead(){
            SharedThread st = new SharedThread("SharedThread");
            Thread a = new Thread(st,"a");
            Thread b = new Thread(st,"b");
            Thread c = new Thread(st,"c");
            Thread d = new Thread(st,"d");
            Thread e = new Thread(st,"e");
            a.start();
            b.start();
            c.start();
            d.start();
            e.start();
    
    }
    
    }

    运行结果:

    可见线程之间互相干扰,产生count值一样的情况,非线程安全的问题出现。

    共享数据线程安全:

    public class SharedSafeThread extends Thread{
        private int count = 5;
        public SharedSafeThread(String name) {
            super();
            this.setName(name);
        }
    
        @Override
        public synchronized void run() {
            super.run();
            count--;
            System.out.println("Thread name: " + Thread.currentThread().getName() + ", count: " + count);
        }
    
    
    }
    
    
    public class ThreadRunMain {
        public static void main(String[] args) {
            testSharedSafeThead();
        }
    
        public static void testSharedSafeThead(){
            SharedSafeThread sst = new    SharedSafeThread("SharedSafeThread");
            Thread a = new Thread(sst,"a");
            Thread b = new Thread(sst,"b");
            Thread c = new Thread(sst,"c");
            Thread d = new Thread(sst,"d");
            Thread e = new Thread(sst,"e");
            a.start();
            b.start();
            c.start();
            d.start();
            e.start();
    
        }
    
    }

    运行结果:

     

    可见线程之间没有互相干扰,count值没有重复,线程安全。

  • 相关阅读:
    angular运行报错“Cannot find module 'ng2-translate'.”
    切换分支
    下载angular项目报错[ERROR] ionic-app-scripts has unexpectedly closed (exit code 1).
    通过原生SQL判断数据是否存在
    多图合并一张长图脚本
    科大讯飞--新冠肺炎检测赛道第八分享
    Mysql定时任务
    Mysql导出数据结构 or 数据
    G6Editor 边的参数配置
    百度坐标转腾讯坐标
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7653151.html
Copyright © 2011-2022 走看看