zoukankan      html  css  js  c++  java
  • 静态变量、实例变量、局部变量、常量以及线程安全

    静态变量也称为类变量,由static关键字修饰,在任何方法、构造函数或代码块外部。类变量在程序启动时被创建,在程序停止时被销毁。类变量被存储在静态存储器中。类变量通过类名访问。

    常量,由final关键字修饰,静态变量的特性常量都有,除此之外,常量必须声明时就被赋值且不能再被改变。常量名一般大写。常量被存储在常量存储器内。

    实例变量,声明在任意方法构造函数或代码块外部。在对象“new”时被创建,对象销毁时被销毁。实例变量是对象的一部分,同对象一起存储在中。实例变量通过对象访问。

    局部变量,在方法、构造函数或代码块中声明。局部变量在进入方法、构造函数或块时创建,退出时被销毁。局部变量存放在各自栈帧的工作内存中。

    常量线程安全

    常量一旦声明就禁止修改,所以是线程安全的。

    静态变量(类变量)不是线程安全的

    单例(非线程安全

    import org.junit.Test;
    
    public class ThreadSafety  implements Runnable{
        private static int count; //声明静态变量
        public void run() {
    
            count = 5;
    
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            count = 10;
            System.out.println("[" +Thread.currentThread().getName()+"] 获取的count 值为 "+count );
    
        }
        @Test
        public void test(){
            ThreadSafety ts = new ThreadSafety();
            for (int i=0;i<1000;i++){
                new Thread(ts,"线程"+i).start();
            }
        }
    }
    

      本应输出的count全部为10,但是根据结果表明静态变量在单例模式下非线程安全

    [线程21] 获取的count 值为 5
    [线程53] 获取的count 值为 5
    [线程270] 获取的count 值为 10
    [线程37] 获取的count 值为 5
    [线程341] 获取的count 值为 10
    [线程306] 获取的count 值为 10
    [线程126] 获取的count 值为 5
    [线程30] 获取的count 值为 5
    [线程125] 获取的count 值为 5
    [线程117] 获取的count 值为 5
    [线程46] 获取的count 值为 5
    [线程118] 获取的count 值为 5
    [线程110] 获取的count 值为 5
    [线程109] 获取的count 值为 5
    [线程94] 获取的count 值为 5

    更改代码将ts 更换成 new ThreadSafety()

     非单例(非线程安全

    import org.junit.Test;
    
    public class ThreadSafety  implements Runnable{
        private static int count; //声明静态变量
        public void run() {
    
            count = 5;
    
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            count = 10;
            System.out.println("[" +Thread.currentThread().getName()+"] 获取的count 值为 "+count );
    
        }
        @Test
        public void test(){
    //        ThreadSafety ts = new ThreadSafety();
            for (int i=0;i<1000;i++){
                new Thread(new ThreadSafety(),"线程"+i).start();
            }
        }
    }

      根据结果发现,静态变量在非单例模式下也非线程安全

    [线程62] 获取的count 值为 10
    [线程118] 获取的count 值为 10
    [线程122] 获取的count 值为 10
    [线程123] 获取的count 值为 5
    [线程121] 获取的count 值为 10
    [线程126] 获取的count 值为 10
    [线程133] 获取的count 值为 10
    [线程119] 获取的count 值为 5
    [线程124] 获取的count 值为 10
    [线程120] 获取的count 值为 10
    [线程95] 获取的count 值为 10
    

      

    实例变量 单例模式下是非线程安全的,非单例模式下是线程安全的。

    单例模式

    import org.junit.Test;
    
    public class ThreadSafety  implements Runnable{
        private int count; //声明实例变量
        public void run() {
    
            count = 5;
    
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            count = 10;
            System.out.println("[" +Thread.currentThread().getName()+"] 获取的count 值为 "+count );
    
        }
        @Test
        public void test(){
           ThreadSafety ts = new ThreadSafety();
            for (int i=0;i<1000;i++){
                new Thread(ts,"线程"+i).start();
            }
        }
    }
    [线程14] 获取的count 值为 10
    [线程27] 获取的count 值为 10
    [线程6] 获取的count 值为 10
    [线程11] 获取的count 值为 10
    [线程16] 获取的count 值为 10
    [线程26] 获取的count 值为 10
    [线程21] 获取的count 值为 10
    [线程23] 获取的count 值为 5
    [线程5] 获取的count 值为 5
    [线程4] 获取的count 值为 10
    [线程3] 获取的count 值为 5
    [线程35] 获取的count 值为 10
    [线程42] 获取的count 值为 10
    [线程7] 获取的count 值为 10
    [线程0] 获取的count 值为 10

    非单例模式(线程安全

    import org.junit.Test;
    
    public class ThreadSafety  implements Runnable{
        private int count; //声明实例变量
        public void run() {
    
            count = 5;
    
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            count = 10;
            System.out.println("[" +Thread.currentThread().getName()+"] 获取的count 值为 "+count );
    
        }
        @Test
        public void test(){
    //       ThreadSafety ts = new ThreadSafety();
            for (int i=0;i<1000;i++){
                new Thread(new ThreadSafety(),"线程"+i).start();
            }
        }
    }
    

      

    局部变量(线程安全

    单例(线程安全

    import org.junit.Test;
    
    public class ThreadSafety  implements Runnable{
    
        public void run() {
            int count; //声明局部变量
            count = 5;
    
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            count = 10;
            System.out.println("[" +Thread.currentThread().getName()+"] 获取的count 值为 "+count );
    
        }
        @Test
        public void test(){
           ThreadSafety ts = new ThreadSafety();
            for (int i=0;i<1000;i++){
                new Thread(ts,"线程"+i).start();
            }
        }
    }
    

    非单例(线程安全

    import org.junit.Test;
    
    public class ThreadSafety  implements Runnable{
    
        public void run() {
            int count; //声明局部变量
            count = 5;
    
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            count = 10;
            System.out.println("[" +Thread.currentThread().getName()+"] 获取的count 值为 "+count );
    
        }
        @Test
        public void test(){
    //       ThreadSafety ts = new ThreadSafety();
            for (int i=0;i<1000;i++){
                new Thread(new ThreadSafety(),"线程"+i).start();
            }
        }
    }
    
  • 相关阅读:
    TinyOS在ubuntu 14.04下安装教程
    C++ STL标准入门
    C++ 模板
    多态
    C++继承
    C++类型转换 -- 由其他类型转换到自定义类型
    运算符重载
    友元
    typedef用法
    c++细节--section1
  • 原文地址:https://www.cnblogs.com/YellowstonePark/p/7772653.html
Copyright © 2011-2022 走看看