同步的意义:
如果没有同步,一个线程的变化就不会被其他线程看到。同步不仅可以阻止一个县城看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每一个线程,都看到同一个锁保护之前所有的修改效果。
共享对象引用
共享对象引用方法:
1.保存在静态域中,作为类初始化的一部分
2.将它保存在volatile域、final域或者通过正常锁定访问的域中。
3.将它放到并发集合
同步的基本方法:
1.继承 extends Thread
2.实现implement Runnbale
3.实现callable
用Runnbale:runnable可以共用一个实例,实现资源共享。
java.util.concurrent中更高级的工具分为三类:
1.Executor Framwork
2.并发集合(Current Collection):CurrentHashmap 、Collections.SynchronizedMap 、Hashtable
3.同步器 Synchronizer: CountDownLatch
线程的生命周期:
新建 start() 就绪 运行 dead
获得处理器资源 失去处理器资源
阻塞:sleep时间到、IO方法返回、获得同步锁
dead:调用stop()、destroy(),run()执行完成,Error或Exception
volatile:
非原子性操作不可使用,例如++,
例子:(AtomicLong)
单例模式
(饿汉模式)
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return insance;
}
}
Java提供四中同步方法:
http://blog.csdn.net/monkey_d_meng/article/details/6251879/
1.notify() 、 wait()生产者消费者:
2.BlockingQueue
线程池:
允许客户将后台线程异步处理的工作加入队列,客户端可以调用一个方法,让后台线程完成了已经在队列中的所有工作之后,优雅的结束自己。
ExecutorService executor= Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
executor.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
executor.shutdown();
}
}
});
}
}