zoukankan      html  css  js  c++  java
  • java多线程的原子性


    class Count {
    	public int num;
    
    	public synchronized void increment() {
    		num++;
    	}
    
    	public int get() {
    		return num;
    	}
    }
    
    public class ThreadDemo1 {
    	public static void main(String[] args) {
    		final Count count = new Count();
    		Runnable runnable = new Runnable() {
    			public void run() {
    				for (int i = 0; i < 15000; i++) {
    //					 System.out.println("i:------" + i + ">>>>>>>>>>>>"
    //						+ Thread.currentThread().getName());
    					count.increment();
    				}
    			}
    		};
    		List<Thread> threads = new ArrayList<>(10);
    		for (int i = 0; i < 10; i++) {
    			Thread thread = new Thread(runnable);
    			threads.add(thread);
    			thread.start();
    		}
    		while (true) {
    			if (allThreadTerminated(threads)) {// 所有线程运行结束
    				System.out.println(count.get());
    				break;
    			}
    		}
    	}
    
    	private static boolean allThreadTerminated(List<Thread> threads) {
    		for (Thread thread : threads) {
    			if (thread.isAlive()) {
    				return false;
    			}
    		}
    		return true;
    	}
    }

    以上代码开了十个线程对num++;操作
    原來我一直以为一句代码就是原子性了,今天从学长处得知原子性不是我想的那样,所以看了一下资料发现:

    原子操作:就是不可再分的操作

    1.以下多线程对int型变量x的操作,哪几个需要进行同步:( )
    A. x=y; B. x++; C. ++x; D. x=1;
    D是原子的,不管几个线程调用都是返回赋值后的x
    B C都不算是原子的,因为别的线程如果调用x的话可能得到没有被赋值的x
    A为原子的但不满足可见性(Visibility)


    2.对于非int类型的变量在赋值时可以使用volatile来保证赋值的时候的原子性


  • 相关阅读:
    CentOS查找目录或文件
    vim使用
    解决Bat脚本中包含中文,运行乱码
    Window系统下搭建GIT本地服务器
    Django1.6 运行manage.py 报错解决办法(ImportError)
    centos7下使用yum安装pip
    hiho_1048_状态压缩2
    hiho_1044 状态压缩
    hiho_1041 国庆出游
    hdu_3555 bomb
  • 原文地址:https://www.cnblogs.com/wei1/p/9582121.html
Copyright © 2011-2022 走看看