1、在java中,多线程同步除了使用synchronized关键字修饰方法,还有别的方法实现线程的同步吗?
2、synchronized用法有什么区别,调用如下代码中的a、b、c三个方法分别在什么情况下是同步的?
public class Test{
public synchronized void a() {
// do something
}
public static synchronized void b() {
// do something
}
public void c(){
// do something 1
synchronized(this){
// do something 2
}
}
}
"多线程同步"包含很多话题,就题主的意思来看应该是说"critical section"保护或者临界区保护 —— 即:保障同一时刻仅有一个线程会执行某个特定的代码区块
这个意义来说,java5以前的写法,就是synchronized了;
LZ举的三个例子,a和c效果完全一样,都是在竞争
this
对象上的锁, 而b是在竞争Test
这个class身上的锁;从多线程编程“尽可能缩小锁范围”的观点来看,a/c能满足需求就绝不用b;而a、c之间比较的话,a更prefer因为够简练
java5以后,jdk创造了
java.util.concurrent.locks
包,里面的类其实就是: 用Condition系列类将原本Object身上的monitor概念抽象出来、用Lock系列类将synchronized关键字的功能抽象出来,使它们能够被更细粒度地使用;并且出现了ReadWriteLock这样对"读写比"较大的需求的专门优化方案也就是说,java5之后的"临界区保护"类的多线程编程可以用synchronized或Lock系列类来完成;
当然,上面说的“线程同步”都是竞争式(抢占式)的,若你的业务是需要线程间合作协同的,那么可以采用协作式的编程方式:即使用Object.wait/Condition来编程;或者使用CountDownLatch, CyclicBarrier, Semaphor 这三个专门用于线程间协同的工具类; 当然这些都看你的业务场景