synchronized 是控制访问的情况下使用,说人话就是在多个线程在访问同一个对象所做的访问控制,大概说一下我了解的synchronized的使用和了解,有错误的描述,大家可以指出来,我及时修改
synchronized是内置锁
简单的使用,这是放在方法上的
public synchronized void test() {
}
这是放在对象上的
public Object object =new Object();
public void test() {
synchronized (object){
}
}
第一段代码属于隐式写法,它的显式写法如下:
public void test() {
synchronized (this){
}
}
其实上面3段代码,都是对象锁,且效果基本一致;这些锁也可以所用于List,String等类型防止并发访问修改导致的问题
接下来讲讲在static作用下的
public synchronized void test() {
//这是属于对象锁
}
public synchronized static void test1() {
//这是类锁,其实也是对象锁
}
这2段代码都是对象锁,为什么说synchronized 是类锁呢,其实就是偷个懒,因为相当于静态方法和成员方法,我只是不知道该怎么描述;虽然这两个都是对象锁,但是这两个锁持有的实例却不一样,因为静态相当于在JDK中有且仅有的一个,但是成员变量却不一样,可能描述的不对,大家懂那个意思就行
分享一下单例写法
懒汉式,安全写法,也是双重检查写法,这个也是属于类锁
private static volatile Test instance = null;
private static Test getInstance() {
if (instance == null) {
synchronized (Test.class) {
if (null == instance) {
instance = new Test();
}
}
}
return instance;
}
private Test() {
}