展开全部

线程同步62616964757a686964616fe4b893e5b19e31333365653330主要有以下种方法(示例中是实现计数的功能):

1、同步方法,即使用synchronized关键字修饰方法,例如:public synchronized void add(int c){...}

2、同步代码块,即有synchronized关键字修饰的语句块,例如:public void addAndGet(int c){

synchronized(this){

count += c;

}

}

3、使用特殊域变量(volatile)实现线程同步,该方法不能保证绝对的同步。

例如:private volatile int count = 0;

4、使用锁实现线程同步,例如:

private Lock lock = new ReentrantLock();
public void add(int c) {
lock.lock();//上锁
try{
count += c;
}finally{
lock.unlock();//解锁
}
}

5、使用原子变量实现线程同步,在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,例如:

private AtomicInteger count= new AtomicInteger(1);
public void add(int c) {
count.addAndGet(c);
}

6、使用局部变量实现线程同步,如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

ThreadLocal 类的常用方法

new ThreadLocal() : 创建一个线程本地变量

get() : 返回此线程局部变量的当前线程副本中的值

initialValue() : 返回此线程局部变量的当前线程的"初始值"

set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

示例代码:

private static ThreadLocal count= new ThreadLocal(){
@Override
protected Integer initialValue(){
return 1;
}
};
public void add(int c){
count.set(count.get() + c);
}

7、使用阻塞队列实现,例如LinkedBlockingQueue,具体使用可百度LinkedBlockingQueue的用法或查看java文档。