java多线程
wxwzy738
这个作者很懒,什么都没留下…
展开
-
正确理解ThreadLocal
转:http://www.iteye.com/topic/103804首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过Threa转载 2014-12-27 16:45:43 · 904 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier的简单应用1
import java.util.Random;import java.util.concurrent.CountDownLatch;public class Test11 { public static void main(String[] args) throws InterruptedException { Runnable task = new Runnable(){ @O原创 2013-01-12 17:07:49 · 805 阅读 · 0 评论 -
使用Semaphore或Condition把任何容器转化为有界的阻塞容器
信号量被初始化为容器所期望容量的最大值。add操作在向底层容器中添加条目之前,需要先 获取一个许可。事实上,如果add操作没有能加入任何东西,它会立刻释放一个许可,同样,一个成功的remove操作释放一个许可,使更多的元素能够加入其中。我们常用的阻塞队列LinkedBlockingQueue是使用Condition来进行限制的,原理差不多。private final Condition n原创 2013-01-12 18:20:10 · 1419 阅读 · 0 评论 -
简单的线程工厂
public interface ThreadFactory根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。 此接口最简单的实现就是:class SimpleThreadFactory implements ThreadFactory { public Thread newThread(Runna原创 2013-01-19 19:15:08 · 2076 阅读 · 0 评论 -
用读写锁包装Map
ReadWriteMap使用了ReentrantReadWriteLock来包装Map,使得它能够在多线程间被安全的共享,并仍然能够避免“读-写”或者“写-写”冲突。现实中,ConcurentHashMap的性能已经足够好了(经查看源代码,里面的是每个hash计算后的散列区域作为锁,这个大大减少了锁之间的竞争),ConcurrentHashMap源码:public V get(Obje原创 2013-01-20 11:07:58 · 2415 阅读 · 0 评论 -
Condition的应用
JDK原话,假定有一个绑定的缓冲区,它支持 put 和 take 方法。如果试图在空的缓冲区上执行 take 操作,则在某一个项变得可用之前,线程将一直阻塞;如果试图在满的缓冲区上执行 put 操作,则在有空间变得可用之前,线程将一直阻塞。我们喜欢在单独的等待 set 中保存 put 线程和 take 线程,这样就可以在缓冲区中的项或空间变得可用时利用最佳规划,一次只通知一个线程。可以使用两个 C原创 2013-01-20 17:44:02 · 889 阅读 · 0 评论 -
停止Java线程,小心interrupt()方法
转自http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html 程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。 在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。 背景 中断(Interrupt转载 2013-01-18 10:26:36 · 59224 阅读 · 11 评论 -
可实时调整运行中的线程个数
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.util.Iterator;import java.util.List;import java.util.concurrent.Callable;import java.ut原创 2013-01-18 10:39:00 · 1203 阅读 · 0 评论 -
wait和notify简单应用1
import java.util.ArrayList;import java.util.List;import java.util.Random;//一个线程去读取List的长度,如果List为空的时候,线程就wait,如果List中有值了,就notify去获取它的长度public class ListAwit { private static List list = new Array原创 2012-09-29 10:14:50 · 692 阅读 · 0 评论 -
扩展线程池ThreadPoolExecutor的简单例子
import java.util.concurrent.BlockingQueue;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;//扩展线程池以提供日志和计时功能public原创 2013-01-15 00:38:45 · 3339 阅读 · 0 评论 -
SynchronousQueue的简单应用2
转:http://blog.csdn.net/orgcheng/article/details/7985503SynchronousQueue的定义如下public class SynchronousQueueextends AbstractQueueimplements BlockingQueue, Serializable从上面可以看出,它实现BlockingQ转载 2013-01-14 23:01:35 · 8960 阅读 · 6 评论 -
Exchanger的简单示例
两个线程可以交换对象的同步点。每个线程都在进入 exchange 方法时给出某个对象,并接受其他线程返回时给出的对象。public class Test { public static void main(String[] args) { final Exchanger exch = new Exchanger(); ExecutorService exec = Executors原创 2012-12-30 14:44:51 · 652 阅读 · 0 评论 -
在java web项目中慎用Executors以及非守护线程
转:http://www.iflym.com/index.php/code/dont-use-executors-and-nondaemon-thread-in-java-web.html 最近研究embeded tomcat,特别是关于tomcat启动和关闭的模块。通过查看相应的源代码, 我们知道tomcat的关闭是通过往相应的关闭端口发送指定的关闭指令来达到关闭tomcat的目的。但转载 2013-03-08 09:27:54 · 1650 阅读 · 0 评论 -
wait和notify在锁竞争中的执行顺序
sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调原创 2013-03-02 11:12:41 · 7945 阅读 · 2 评论 -
ThreadLocal,ThreadLocalMap,Thread 的相互关系以及设计原理分析
一句话,ThreadLocal并不是把线程作为key,值作为value的类似一种HashMap的东西。而是每个Thread里面都有一个ThreadLocalMap的集合,ThreadLocal只是操作每个线程的ThreadLocalMap而已。转:http://www.iteye.com/topic/10075151.ThreadLocal. 真正关键的类是它的内部类Threa转载 2014-12-27 16:40:58 · 2070 阅读 · 0 评论 -
不得不提的volatile及指令重排序(happen-before)
转:http://www.th7.cn/Program/java/201312/166504.shtml一、不得不提的volatilevolatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它;我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它。比如Thread这个很基础的类,其中很重要的线程状转载 2015-01-28 20:43:17 · 18190 阅读 · 20 评论 -
Java中的Copy-On-Write容器
转:http://ifeve.com/java-copy-on-write/转载 2014-05-12 20:18:31 · 1118 阅读 · 0 评论 -
ThreadPoolExecutor的作用
转jdk的原文转载 2014-04-19 21:59:00 · 2908 阅读 · 0 评论 -
多线程的小知识点
1、++i不是原子性的,它是由三个步骤组成的,获得当前值,加1,写回新值。假设当前i的值为9,如果两个线程都同时读取i值,读到的都是9,然后同时加1,那么这时i的值变为10,但其实是需要加两次,值是11的。原创 2013-11-13 19:51:05 · 1755 阅读 · 0 评论 -
java的基本类型和i++线程安全性的深入解析
在java中,除了long和double的64比特的变量外,其他的基本变量都是原子性的。说起原子性的操作,是值读和写是原子性的,比如i=5;这个就是一个原子性的操作。但是两个原子性的操作合在一起进行,就不一定是原子性的了,比如先读后写,那么就有可能在读之后这个变量被修改过。i++就是这样的一个操作,先读后写,所以说整型变量是原子性的,不是说i++就是一个原子性的操作。当你使用for原创 2013-11-18 13:48:26 · 8674 阅读 · 2 评论 -
用 Quartz 进行作业调度
转:http://www.ibm.com/developerworks/cn/java/j-quartz/现代的 Web 应用程序框架在范围和复杂性方面都有所发展,应用程序的每个底层组件也必须相应地发展。作业调度是现代系统中对 Java 应用程序的一般要求,而且也是对 Java 开发人员一贯的要求。虽然目前的调度技术比起原始的数据库触发器标志和独立的调度器线程来说,已经发展了许多,但是转载 2013-09-10 11:47:49 · 1125 阅读 · 0 评论 -
Quartz使用之:HelloWorld
转:http://wangrui.iteye.com/blog/1507041.目的: 怎样创建、开始、暂停、关闭Quartz的scheduler?怎样用Quartz执行一个定时任务? 2.HelloWorld任务。 Quartz中的任务必须实现org.quartz.Job接口, public interface Job { void execute(Job转载 2013-09-10 11:45:12 · 1396 阅读 · 0 评论 -
使用CompletionService批处理任务
如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果。为此你可以保存与每个任务相关联的Future,然后不断地调用timeout为零的get,来检验Future是否完成。这样做固然可以,但却相当乏味。幸运的是,还有一个更好的方法:完成服务(Completion service)。CompletionService整合了Executor和BlockingQueue的功能。你原创 2013-01-13 13:01:27 · 20365 阅读 · 7 评论 -
线程试题
1,模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完整这些日志修改程序代码,开四个线程让这16个对象在4秒内打印完成源代码:public class LogTest { public static void main(String[] args) { System.out.println("begin:"+(System.currentTime原创 2012-10-22 22:54:18 · 855 阅读 · 0 评论 -
使用CAS实现的非阻塞计数器
//使用CAS实现的非阻塞计数器public class CasCount { private SimulatedCAS value; public int getValue(){ return value.get(); } public int increment(){ int v; do{ v = value.get(); }while(v != value.c原创 2013-01-20 22:52:22 · 1160 阅读 · 0 评论 -
synchronized
synchronized的一个简单例子public class TextThread { /** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根 TxtThread tt = new TxtThread(); new Thread(tt).start(); n转载 2013-01-29 13:36:38 · 1194 阅读 · 0 评论 -
CyclicBarrier的简单事例
import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierTest { public static void main(String[] args) { Runnable run = new Runnable(原创 2012-10-17 10:04:50 · 589 阅读 · 0 评论 -
使用线程池和CountDownLatch计数器来进行抓取的简单事例2
import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import org.apache.log4j.Logger;import util.Proxy原创 2012-09-26 09:54:32 · 929 阅读 · 0 评论 -
使用线程池和CountDownLatch计数器来进行抓取的简单事例1
package tangjiu;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import util.StringUtil;import l原创 2012-09-24 10:36:33 · 1891 阅读 · 0 评论 -
由生产者/消费者问题看JAVA多线程
转:http://blog.csdn.net/coutcin/article/details/1213834生产者消费者问题是研究多线程程序时绕不开的问题,它的描述是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。 解决生产者转载 2012-09-29 17:56:22 · 893 阅读 · 0 评论 -
Java 信号量 Semaphore 介绍
转:http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.htmlSemaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许转载 2012-10-12 11:23:33 · 873 阅读 · 0 评论 -
wait和notify以及notifyAll的使用方法
public class WaitTest { public static void main(String[] args) { final WaitTest w = new WaitTest(); for(int i=0; i<4; i++){ new Thread(new Runnable(){ public void run() { w.accessBloc原创 2012-09-28 17:03:44 · 2170 阅读 · 1 评论 -
多线程的创建方式
public static void main(String[] args) { Thread thread=new Thread(){ public void run(){ for(int i=0;i<=100;i++){ System.out.println(Thread.currentThread().getName()+":【"+i+"】"); } } };原创 2012-04-21 16:08:10 · 613 阅读 · 0 评论 -
缓存功能(简单的synchronized和使用读写锁)
使用synchronized:class MyCache{ private Map cache = new HashMap(); public synchronized Object getObject(String key){ //加上锁是为了避免多个线程在得到的value都为null时,都同时去访问数据库 Object value=cache.get(key); if(va原创 2012-04-22 22:53:28 · 3989 阅读 · 0 评论 -
Lock的简单运用
public class Thread13 {public static void main(String[] args) { final Thread13 test=new Thread13(); new Thread(){ public void run(){ while(true){ test.printname("aaaaaaaaa"); } } }.s原创 2012-04-22 21:04:03 · 586 阅读 · 0 评论 -
读写锁的简单运用
与互斥锁定相比,读-写锁定允许对共享数据进行更高级别的并发访问。虽然一次只有一个线程(writer 线程)可以修改共享数据,但在许多情况下,任何数量的线程可以同时读取共享数据(reader 线程),读-写锁定利用了这一点。从理论上讲,与互斥锁定相比,使用读-写锁定所允许的并发性增强将带来更大的性能提高。在实践中,只有在多处理器上并且只在访问模式适用于共享数据时,才能完全实现并发性增强。publ原创 2012-04-22 21:53:25 · 718 阅读 · 0 评论 -
Timer与ScheduledExecutorService定时器的比较及其简单事例
import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ScheduledFuture;import java.ut原创 2012-10-17 10:33:12 · 3295 阅读 · 0 评论 -
join()的简单事例
/** * join()为让线程j1加入到线程j2的前面,在线程j1执行完之前,线程j2不能工作 */public class JoinTest extends Thread{ public JoinTest(String name){ super(name); } public static void main(String[] args) throws InterruptedE原创 2012-10-18 09:24:41 · 689 阅读 · 0 评论 -
interrupt()、setDemo()和Timer的简单示例
import java.util.Timer;import java.util.TimerTask;import java.util.concurrent.TimeUnit;public class InterruptSetDemoTest { public static void main(String[] args) { //创建一个线程t让它睡眠十秒 final Thread原创 2012-10-28 13:05:28 · 1263 阅读 · 0 评论 -
SynchronousQueue的简单应用1
使用jdk的原话:一种阻塞队列,其中每个 put 必须等待一个take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头 是尝试添加到队列中的首个已排队线程元素;如果没有已排队线程原创 2013-01-14 22:50:12 · 1789 阅读 · 0 评论