volatile适用场景
摘要:1.volatile最适用一个线程写,多个线程读的场合。
如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。(摘自Netty权威指南)
疑问:如果只是赋值的原子操作,是否可以多个线程写?
阅读全文
posted @
2015-01-01 21:28
上校
阅读(7764)
推荐(0) 编辑
Java并发编程:volatile关键字解析
摘要:Java并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。
阅读全文
posted @
2015-01-01 15:13
上校
阅读(493)
推荐(0) 编辑
JAVA CAS原理深度分析
摘要:CAS
CAS:Compare and Swap, 翻译成比较并交换。
java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。
本文先从CAS的应用说起,再深入原理解析。
阅读全文
posted @
2015-01-01 00:43
上校
阅读(8881)
推荐(2) 编辑
ArrayList,Vector线程安全性测试
摘要:结论:如果集合不是线程安全的话,在多线程情况下插入数据会出现数据丢失的问题。
Java代码
import java.util.ArrayList;
import java.util.List;
//实现Runnable接口的线程
public class HelloThread implements Runnable {
String name;
List v;
阅读全文
posted @
2014-12-24 00:38
上校
阅读(3545)
推荐(0) 编辑
Java线程专栏文章汇总(转)
摘要:原文:http://blog.csdn.net/ghsau/article/details/17609747
JDK5.0之前传统线程
Java线程(一):线程安全与不安全
Java线程(二):线程同步synchronized和volatile
Java线程(三):线程协作-生产者/消费者问题
Java线程(四):线程中断、线程让步、线程睡眠、线程合并
Java线程(五):Timer和TimerTask
阅读全文
posted @
2014-12-24 00:03
上校
阅读(305)
推荐(0) 编辑
Java队列集合的性能测试
摘要:同时开10个线程存入和取出100万的数据,结论如下:
DoubleBufferedQueue ConcurrentLinkedQueue ArrayBlockingQueue LinkedBlockingQueue
执行结果如下:
DoubleBufferedQueue入队时间:9510 出队时间:10771
DoubleBufferedQueue入队时间:8169 出队时间:9789
ConcurrentLinkedQueue入队时间:10557 出队时间:13716
ConcurrentLinkedQueue入队时间:25298 出队时间:25332
ArrayBlockingQueue入队时间:21080 出队时间:22025
ArrayBlockingQueue入队时间:17689 出队时间:19654
LinkedBlockingQueue入队时间:38236 出队时间:52555
LinkedBlockingQueue入队时间:30646 出队时间:38573
阅读全文
posted @
2014-12-11 20:58
上校
阅读(8266)
推荐(0) 编辑
Java多线程总结之线程安全队列Queue
摘要:在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。
注:什么叫线程安全?这个首先要明确。线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的。如果由于多线程的访问(比如修改、遍历、查看)而使这些变量结构被破坏或者针对这些变量操作的原子性被破坏,则这个类就不是线程安全的。
今天就聊聊这两种Queue,本文分为以下两个部分,用分割线分开:
阅读全文
posted @
2014-12-04 14:20
上校
阅读(7457)
推荐(1) 编辑
并发工具类(三)控制并发线程数的Semaphore
摘要:原文:http://ifeve.com/concurrency-semaphore/#more-14753
简介
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。
阅读全文
posted @
2014-12-03 15:32
上校
阅读(536)
推荐(0) 编辑
Java多线程之银行出纳员仿真
摘要:package concurrent;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
阅读全文
posted @
2014-06-14 13:54
上校
阅读(1442)
推荐(1) 编辑
Java多线程之新类库中的构件PriorityBlockingQueue
摘要:package concurrent2;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;
阅读全文
posted @
2014-06-13 00:03
上校
阅读(2731)
推荐(0) 编辑
Java多线程之新类库中的构件DelayQueue
摘要:package concurrent;
import java.util.Random;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
阅读全文
posted @
2014-06-12 00:22
上校
阅读(412)
推荐(0) 编辑
Java多线程之新类库中的构件CyclicBarrier
摘要:演示代码1:
package concurrent;
import java.util.concurrent.CyclicBarrier;
public class TestCyclicBarrier {
private static final int THREAD_NUM = 5;
public static class WorkerThread implements Runnable{
CyclicBarrier barrier;
阅读全文
posted @
2014-06-12 00:00
上校
阅读(406)
推荐(0) 编辑
Java多线程之新类库中的构件CountDownLatch
摘要:使用CountDownLatch类
package concurrent;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo01 {
阅读全文
posted @
2014-06-11 23:26
上校
阅读(380)
推荐(0) 编辑
java多线程之死锁
摘要:产生死锁的条件:
1.有至少一个资源不能共享
2.至少有一个任务必须持有一个资源并且等待获取另一个被别的任务持有的资源
3.资源不能任务抢占
4.必须有循环等待
只要打破其中一个条件就不会产生死锁,通常是打破第4个条件
阅读全文
posted @
2014-06-11 21:53
上校
阅读(7257)
推荐(0) 编辑
java多线程之生存者与消费者(Java编程思想)
摘要:1.Restaurant
package Produce;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
阅读全文
posted @
2014-06-08 23:17
上校
阅读(2737)
推荐(0) 编辑
Java多线程之notifyAll的作用域
摘要:notifyAll()因某个特定锁而被调用时,只有等待这个锁的任务才会被唤醒。
package Thread.Wait;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Blocker {
synchronized void waitingCall() {
try {
阅读全文
posted @
2014-05-29 00:13
上校
阅读(981)
推荐(0) 编辑
Java多线程之Wait()和Notify()
摘要:1.Wait()和Notify、NotifyAll都是Object的方法
2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成
3.当调用Wait()方法时,当前线程进入阻塞状态,直到有另一线程调用了该对象的Notify()方法
package Thread.Wait;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class Car {
private boolean waxOn = false;
阅读全文
posted @
2014-05-28 22:33
上校
阅读(815)
推荐(0) 编辑
Java多线程之线程结束清理
摘要:该事例说明了清理工作必须要放在finally块中
package Thread.Interrupting;
import java.util.concurrent.TimeUnit;
class NeedsCleanup {
private final int id;
public NeedsCleanup(int ident) {
id = ident;
System.out.println("NeedsCleanup " + id);
}
public void cleanup() {
System.out.println("Cleaning up " + id);
}
}
阅读全文
posted @
2014-05-28 00:10
上校
阅读(8615)
推荐(0) 编辑
Java多线程之阻塞I/O如何中断
摘要:阻塞的I/O线程不会被打断,需要关闭资源才能打断
package Thread.Interrupting;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
阅读全文
posted @
2014-05-27 23:08
上校
阅读(12074)
推荐(1) 编辑
Java多线程之线程中断
摘要:该例子说明,Sleep可以被中断,但是I/O和synchronized不能被中断。
package Thread.Interrupting;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
阅读全文
posted @
2014-05-27 22:14
上校
阅读(495)
推荐(0) 编辑