synchronized关键字
保证被它修饰的方法或者代码块在任意时刻只能一个线程执行
三种使用方式
1.修饰实例方法:给当前对象实例加锁,进入同步代码块前需要获取当前对象实例的锁
public synchroniced void method(){
//代码
}
2.修饰静态方法:给当前类加锁。对于所有的这个类所创建的实例对象,都会加一个class的锁。。线程A调用当前方法的synchronized锁,线程B调用当前类的Synchronized的锁是不冲突的。因为不是一个锁
public synchronized static void method(){}
3.修饰代码块
指定加锁对象,给指定的对象/类加锁。
synchronized(this/target) 表示进入同步代码块要获得当前对象的锁
synchronized(.class)表示进入同步代码块要获得当前类的锁
synchronized(this){
//代码块
}
总结:
synchronized放在静态方法或者synchronized(.class)都是在类上面加锁
synchronized加到实例方法上都是给当前实例对象加锁
不可以用synchronized(String s),因为字符创常量池是有缓存的功能的
构造方法本身就是线程安全的,不需要synchronized修饰,构造方法不能使用 synchronized 关键字修饰。