synchronized关键字是用来控制线程同步的,在多线程的环境下控制synchronized括号中的对象在同一时刻只能被一个线程使用。
在应用层,可以把任何一个非null对象作为锁。synchronized作用在方法上时,锁的是当前实例对象的成员方法,叫成员锁;作用在静态方时锁住的是当前Class实例,相当于该类的一个全局锁;作用于某个代码块时,锁住的是对应的代码块,也叫成员锁,详细了解对象可以参考此文章。
Object类里面有多个被synchronized修饰的方法,如果一个对象的线程锁被线程获取,那么对于本对象里面的所有被synchronized修饰的方法其他线程都不能访问。如果Object类实例化多个对象,一个线程获取其中一个,只能控制自己获取的对象锁所对应的方法不被其他线程使用。但其他线程可以通过其他对象访问被synchronized修饰的方法。
例如
一、
public class Object{
public synchronized void test(){ }
public synchronized void what(){}
}
1 Object a=new Object(); 2 Object b=new Object(); 3 Object c=new Object();
如果线程1 使用了a对象调用了test方法,那线程2不能再通过a调用test方法和what方法,但可以通过b调用test方法和what。此时作用于类的方法上,因此是成员锁。
二、
public Object synMethod(Object a){
synchronized(a){
//此处的代码一次只能一个线程执行
}
}
对于第二点,括号里面的参数可以是任何对象(因为它只是方法的一个参数,因此这里是成员锁),可以new一个byte对象,占用内存更小,参数的目的是能有一个锁让线程获取,仅此而已。
三、
synchronized(this),这样的锁(对象锁)被一个线程获取,那别的线程在该类的所有对象上的任何操作都不可行。这是一种很粗糙的方法。
四、
synchronized(Object.class),这样的锁(对象锁)被一个线程获取,那别的线程在该类的所有对象上的任何操作都不可行,包括静态方法和静态变量。对于含有静态方法和静态变量的代码块的同步,通常使用这种方法来加锁。
可以参考百度百科synchronized。
网友评论