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线程修改后的值,再次进行修改。。。。,这个是线程安全的。

  • 相关阅读:
    Android开发中常见的错误
    使用命令行的方式向GitHub中上传本地项目
    jmeter保存测试结果到文件
    转 Jmeter参数化的4种方法
    键盘各键对应的编码值(key)
    CacheHelper对缓存的控制
    Oracle存储过程
    Oricle中SQL语法
    python学习资料百度网盘分享
    一些网站学习的链接
  • 原文地址:https://www.cnblogs.com/libin6505/p/10784465.html
Copyright © 2011-2022 走看看