synchronized是java中的关键字,表示同步,可以在多线程环境中起到锁的作用。它是jvm层面的锁,不需要人为获取释放锁资源,由jvm决定。
synchronized可以直接用在方法上,这种用法和synchronized在代码块中修饰this是一样的。
synchronized也可以直接用在static静态方法上,这种用法和synchronized在代码块中修饰.class类似,说类似是因为代码块粒度更小一些。
它也可以用在代码块中,这时候它可以修饰一个类对象.class,一个全局对象lock,或者this。
一般我们关注的就是修饰.class和this的区别。
修饰.class,就是表示多线程调用该类的不管什么实例,所有实例共用一把锁。
修饰this,多线程调用该类的实例,如果每个线程都有一个实例,那么每个实例都有各自的锁,他们互相不影响。如果多线程去竞争一个实例,那么这个锁就只有一把,多线程去争一个资源。
下面通过一个示例来看看他们的区别:
package com.xxx.lock;
import java.util.Date;
public class SynchronizedExample {
public static void main(String[] args) {
for(int i=0;i<5;i++){
BusinessService businessService = new BusinessService();
new BusinessThread(businessService).start();