测试多线程访问共享资源小测试【我】

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改为自己对应的值。线程不安全。

加同步后:

扫描二维码关注公众号,回复: 6046283 查看本文章

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

猜你喜欢

转载自www.cnblogs.com/libin6505/p/10784465.html
今日推荐