首页 > 多线程的同步问题

多线程的同步问题

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
        }
    }
}

请参见java.util.concurrent.locks


a() 和c()一样,是获得当前对象的方法锁,而b是获得这个类的锁,一次只有一个线程在执行这个方法。


还有读写锁,volitale关键字


"多线程同步"包含很多话题,就题主的意思来看应该是说"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 这三个专门用于线程间协同的工具类; 当然这些都看你的业务场景

【热门文章】
【热门文章】