线程:一行行代码往下执行。
Thread 的 run() ,如果没被覆盖,且为Thread设置了Runnable对象,则会调用Runnable的run();
线程互斥与同步通信
线程安全问题可以用银行转账来说明。
线程同步:必须把锁加在同一对象上,或同一类上,
方法上加synchronized ,同一个对象的Wait();等待 notify();唤醒任意一个
线程范围内的共享数据,例如:DB connection
connection.beginTransaction connection.commit()
每个线程绑定一个connetion, 这样能保证事务的原子性。
ThreadLocal<T> 相当于 Map<Thread.currentThread,T>
多个线程访问共享数据
1.如果每个线程执行的代码相同,可以放在同一Runnable中,Runnable中有共享数据。
2.共享数据放另一对象中,多个Runnable操作这些数据。
Java5的新特性:
Java.util.concurrent
Java.util.concurrent.atomic
线程池 :java.until.concurrent.Executors
固定大小线程池 缓存线程池 单一线程池 计时器线程池
Callable && future
Callable采用ExecutorService.submit() 提交
CompletionService.take(); 哪个先完成先拿哪个。
Java.until.concurrent.locks
Lock类比传统线程模型中的synchronized方式更加面向对象。
两个线程执行的代码片段要实现同步互斥的效果,他们必须使用同一Lock对象。
锁是上在代表要操作的资源的类的内部方法中,而不是线程代码中。
读写锁:多个读锁不互斥,读锁与写锁互斥,多个写锁互斥,这是由jvm自己控制的。
ReadWriteLock
Condition功能类似传统线程技术中的Object.wait()和Object.notify()的功能。
在等待Condition时,允许发生“虚假唤醒”,这通常作为对基础平台语义的让步。对于大多数应用程序,这带来的实际影响很小,因为Condition应该总是在一个循环中被等待,并测试正被等待的状态声明。
一个锁内部可以有多个Condition.
Condition condition = new lock.newCondition();
Condition.await();
Condition.signal();
阻塞队列 起到缓冲的作用
Semaphore实现信号灯
可以维护当前访问自身的线程个数,并提供了同步机制。
单个信号量的semaphore可以实现同步互斥锁的功能。
CyclicBarrier
表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定的地点集合碰面。
CountDownLatch
犹如倒计时计数器。
可以实现一个人(也可多个人)等待其他人来通知他,可以实现一个人通知多个人的效果,类似裁判一声令下,运动员同时开始奔跑。
Exchanger
实现两个线程之间的数据交换,每个在完成一定的事务后想与对方交换数据,第一个先拿出数据的将一致等待到第二个带来数据时,才能彼此交换数据。
阻塞队列
BlockingQueue<E>
Insert add抛出异常 offer返回真假 put阻塞在那
Remove remove poll take
Examine element peek
同步集合
ConcurrentHashMap
CopyOnWriteArrayList
CopyOnWriteArraySet
Spring借助threadlocal实现了dao jdbcTemplate ,service transaction的线程安全。
Springmvc 拦截到方法,实现了方法级别的线程安全,尽量不要在controller中定义全局变量,如果需要也是threadlocal级别。