并发编程学习笔记(一)
2015-06-12 00:00
162 查看
摘要: 原子性操作,锁机制,并发容器
java原子性机制:
使用已有的原子类AtomicXXX类,保证原子操作。
使用内置锁机制 synchronized
对一个servlet方法,如果加上synchronized,能够保证每次只有一个线程调用servlet方法,保证了线程的安全性,但是,性能消耗太大,违背了servlet的初衷--servlet是可以同时处理多个请求操作的,这种web应用的运行方式叫:弱并发。
以上是通过同步来避免多个线程在同一时间访问同一数据,下面学习的是共享和发布对象的技术,使多个线程能够安全的访问他们。
这是一个不安全的例子,看似结果会输出2 ,其实不然。
锁机制,不仅仅是为了保证线程之间的同步,还是为了能够让所有的线程都能能看见共享的、可变变量的最新值,这就是可见性。一个线程能够观察到另外一个线程所做的所有事。
注意:加锁可以保证可见性和原子性,但是volatile变量只能保证可见性。
线程封闭也可以实现线程安全。--jdbc的connection就是这样的。
2.
同步容器:Vector和Hashtable,一次只有一个线程可以访问。
并发容器:
java.util.concurrent包下面的类:ConcurrentHashMap;CopyOnWriteArrayList;
java.util.concurrent包下面的接口: ConcurrentMap;
新增的容器:Queue接口,主要实现类:ConcurrentLinkedQueue(FIFO)
新增的容器:BlockingQueue ,主要实现类:LinkedBlockingQueue,ArrayBlockingQueue,(FIFO)PriorityBlockingQueue(按优先级顺序排列)
BlockingQueue扩展了Queue,增加了可阻塞的插入和获取操作,即:如果队列塞满了,插入操作会阻塞,直到队列中有可用空间;如果队列是空的,获取操作会一直阻塞,直到队列中有可用元素。(生产者-消费者)。
java原子性机制:
使用已有的原子类AtomicXXX类,保证原子操作。
使用内置锁机制 synchronized
对一个servlet方法,如果加上synchronized,能够保证每次只有一个线程调用servlet方法,保证了线程的安全性,但是,性能消耗太大,违背了servlet的初衷--servlet是可以同时处理多个请求操作的,这种web应用的运行方式叫:弱并发。
以上是通过同步来避免多个线程在同一时间访问同一数据,下面学习的是共享和发布对象的技术,使多个线程能够安全的访问他们。
/** * @author xiongsheng (Ailk No.) * @version 1.0 * @since 2015-6-9 * @category copyright Ailk NBS-Network Mgt. RD Dept. */ public class NoVisibility { private static int number; private static boolean ready; private static class ReadThread extends Thread { public void run() { while (!ready) Thread.yield(); System.out.print(number); } } public static void main(String[] args) { new ReadThread().start(); number = 2; ready = true; } }
这是一个不安全的例子,看似结果会输出2 ,其实不然。
锁机制,不仅仅是为了保证线程之间的同步,还是为了能够让所有的线程都能能看见共享的、可变变量的最新值,这就是可见性。一个线程能够观察到另外一个线程所做的所有事。
注意:加锁可以保证可见性和原子性,但是volatile变量只能保证可见性。
线程封闭也可以实现线程安全。--jdbc的connection就是这样的。
2.
同步容器:Vector和Hashtable,一次只有一个线程可以访问。
并发容器:
java.util.concurrent包下面的类:ConcurrentHashMap;CopyOnWriteArrayList;
java.util.concurrent包下面的接口: ConcurrentMap;
新增的容器:Queue接口,主要实现类:ConcurrentLinkedQueue(FIFO)
新增的容器:BlockingQueue ,主要实现类:LinkedBlockingQueue,ArrayBlockingQueue,(FIFO)PriorityBlockingQueue(按优先级顺序排列)
BlockingQueue扩展了Queue,增加了可阻塞的插入和获取操作,即:如果队列塞满了,插入操作会阻塞,直到队列中有可用空间;如果队列是空的,获取操作会一直阻塞,直到队列中有可用元素。(生产者-消费者)。
相关文章推荐
- VIEWGOOD(远古)视频医疗示教解决方案
- MyEclipse空间配置
- Echarts图表生成图片
- Eclipse RCP中多线程Job使用
- SpringMVC与Struts2的对比
- Spring MVC + zTree调试过程出现406 not acceptable
- 面向对象编程
- Java加密解密(二) Base64编码
- java格式化json
- Spring day01 (托管)
- struts2 团队开发
- python twisted socket 服务端 客户端
- eclipse中单机运行统计单词
- Java web.xml session-config 属性配置
- Thrift简单入门
- THINKPHP框架的优秀开源系统推荐
- Spring的试水!!!感觉还行
- 【转】将32位代码向64位平台移植的注意事项
- struts2 第一次使用 404 页面引发的一系列问题
- 01 Java学习之Java简介