zoukankan      html  css  js  c++  java
  • 测试多线程访问共享资源小测试【我】

    Service:

    package thread;
    
    public class Service implements Runnable{
    
        //共享资源
        private int count = 0;
        
        @Override
        public void run() {
            operateCount();
        }
        
        //多线程操作共享资源的方法
        /* synchronized */  private void operateCount() {
            //打印当前线程获取到的值,即 读
            System.out.println(Thread.currentThread().getName()+"--get--count:"+count);
            
            try {
                //取一个0到1000的随机数
                int r = (int) (Math.random()*1000);
                Thread.sleep(r);
                //修改值
                count=r;
            } catch (Exception e) {
                e.printStackTrace();
            }
            //打印当前线程修改后的值,即 写
            System.out.println(Thread.currentThread().getName()+"--set--count:"+count);
        }
    
    }

    test:

    package thread;
    
    public class T {
    
        public static void main(String[] args) {
            Service service = new Service();
            new Thread(service).start();
            new Thread(service).start();
            new Thread(service).start();
        }
    }

    结果:

    不加同步:

    Thread-0--get--count:0
    Thread-2--get--count:0
    Thread-1--get--count:0
    Thread-1--set--count:340
    Thread-2--set--count:514
    Thread-0--set--count:803

    说明,3个线程同时获取到了初始值0,然后分别把0改为自己对应的值。线程不安全。

    加同步后:

    Thread-0--get--count:0
    Thread-0--set--count:745
    Thread-2--get--count:745
    Thread-2--set--count:978
    Thread-1--get--count:978
    Thread-1--set--count:575

    说明,3个线程是按顺序执行的,第一次0线程获取到了0,然后执行设置值操作,然后2线程读到了已经被0线程修改后的值,再次进行修改。。。。,这个是线程安全的。

  • 相关阅读:
    类的加载顺序
    自定义形状类
    java的参数传递
    复数相加+equels、hashcode、clone<二>
    复数相加+equels、hashcode、clone<一>
    命令行程序
    计算阶乘
    控制程序的流程
    java运算符
    强制类型转换细节解析
  • 原文地址:https://www.cnblogs.com/libin6505/p/10784465.html
Copyright © 2011-2022 走看看