java 并发之synchronized、volatile

来源:互联网 发布:耳朵音乐cms 编辑:程序博客网 时间:2024/05/16 18:10

synchronized

加上synchronized关键字说明在多线程环境下只有一个线程能获得关键字所修饰的对象锁。

volatile

通过下面的例子可以看到volatile是不能在多线程环境下面保证数据安全的,也就是谁volatile关键字解决了值的可见性问题,但是并不能控制并发,也就是说如果用volatile关键字做为修饰符,线程获取的不是线程的本地副本,而是直接内存里面的。

我在程序里面在add方法前面加上synchronized和不加做了简单的测试

不加synchronized关键字多次运行Demo程序有时候输出500有时候输出501,
而加上synchronized关键字后则一直是500

public enum CurrentTest {  INSTANCE;  volatile int number;  int max_size = 500;  private Map<String, String> cMap = new HashMap<String, String>();  public synchronized void add(String key, String value) {    if (number < max_size) {      cMap.put(key, value);      number ++;    }  }  public int getNumber() {    return number;  }}
    CurrentTest test = CurrentTest.INSTANCE;    Runnable runnable = new Runnable() {      @Override      public void run() {        String uuid = UUIDFactory.INSTANCE.getUUID();        for (int i = 0; i < 600; i++) {          test.add(uuid.toString(), System.currentTimeMillis() + "");        }        System.out.println(test.getNumber());      }    };    Runnable runnable1 = new Runnable() {      @Override      public void run() {        String uuid = UUIDFactory.INSTANCE.getUUID();        for (int i = 0; i < 509; i++) {          test.add(uuid.toString(), System.currentTimeMillis() + "");        }        System.out.println(test.getNumber());      }    };    Runnable runnable2 = new Runnable() {      @Override      public void run() {        String uuid = UUIDFactory.INSTANCE.getUUID();        for (int i = 0; i < 509; i++) {          test.add(uuid.toString(), System.currentTimeMillis() + "");        }        System.out.println(test.getNumber());      }    };    Thread a = new Thread(runnable);    Thread b = new Thread(runnable);    Thread c = new Thread(runnable);    Thread d = new Thread(runnable1);    Thread e = new Thread(runnable1);    Thread f = new Thread(runnable1);    Thread g = new Thread(runnable2);    Thread h = new Thread(runnable2);    Thread i = new Thread(runnable2);    a.start();    b.start();    c.start();    d.start();    e.start();    f.start();    g.start();    h.start();    i.start();  }
0 0