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值没有重复,线程安全。

  • 相关阅读:
    DFS的联通性问题
    Stl-unordered_map 无序关联式容器的基本用法(xmind)
    【图论】匈牙利算法——社会人数规模专家
    AcWing 860. 染色法判定二分图
    AcWing 1227. 分巧克力(二分)
    【图论】【最小生成树】prim【AcWing】局域网&&繁忙的都市
    【图论】拓扑排序
    Stl—bitset用法
    vector< vector<int> > 的初始化
    Floyd——人人都是中间商(50%)
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7653151.html
Copyright © 2011-2022 走看看