您的位置:首页 > 编程语言

并发编程学习笔记(一)

2015-06-12 00:00 162 查看
摘要: 原子性操作,锁机制,并发容器

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,增加了可阻塞的插入和获取操作,即:如果队列塞满了,插入操作会阻塞,直到队列中有可用空间;如果队列是空的,获取操作会一直阻塞,直到队列中有可用元素。(生产者-消费者)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: