多线程同步,首先需要明白的是什么是多线程同步。
所谓的多线程同步,以我的理解,就是多个线程同步的去做一件事事情,用面向对象的说法就是,多个线程操作一个对象的某个方法。
而,多个线程操作多个同一个类的实例并不是多线程同步,而是,每个线程操作每个自己的实例的某个方法。
多线程同步的时候,需要用到synchornized修饰符,synchronized有两种用法
第一种:
修饰一个方法
例如:
public class Person
{
public synchronized void doSomething()
{
//
}
}
那么当多个线程同时操作同一Person的实例的doSomething()方法的时候,那么多个线程就会产生同步问题
synchronized修饰的方法,会个当前对象上锁,这时候,当多个线程执行到doSomething()的时候,先执行到该方法的线程将当前对象上锁,其他线程则不可以对当前对象进行操作
第二种:
synchronized代码块
例如
public void run()
{
synchronized(Object)
{
//同步部分 对Object上锁,同步代码块当多个线程执行到同一个对象的synchornized代码块的时候,先到达的线程对同步代码块赏所,其他线程无法操作。
}
}
推荐使用第二种方法,因为第二种方法控制的更加细粒度化,我们可以只将发生同步的代码放到同步代码块中。而第一种方法,某一时刻,只能由一个线程执行synchornized方法,其他线程不可以访问当前对象的任何synchornized方法。因为此时我们上锁上的是当前对象而不仅仅是当前方法。