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
- java 并发之synchronized、volatile
- Java并发同步之synchronized与volatile
- Java 并发---解读volatile synchronized
- java并发编程之1——synchronized和volatile
- Java并发编程之volatile、synchronized、yield、join
- Java并发基础(四)-volatile和synchronized
- java并发之synchronized
- java并发之synchronized
- Java并发之volatile
- java并发之volatile
- java并发之volatile
- java并发编程之synchronized
- java并发编程之synchronized
- java 并发编程之synchronized。
- Java并发编程之synchronized
- Java并发编程之synchronized
- Java并发之synchronized关键字
- Java并发之synchronized关键字
- AS运行Module红色叉叉
- STM32启动文件——startup_stm32f10x_hd.s
- Android侧滑控件DrawerLayout实战案例
- 深入理解Activty的启动
- 全文检索引擎Solr系列——整合中文分词组件IKAnalyzer
- java 并发之synchronized、volatile
- input与textarea实时监控,原生JS与JQ两种方法
- JNI初步认识
- Android相机拍照,储存
- RecyclerView瀑布流
- 9_四大组件的工作过程
- iOS中new和alloc的区别
- 增加一个新概念———全栈工程师
- 全文检索引擎Solr系列——整合MySQL、MongoDB