简单记录下java中synchronized关键字的使用方法。
在介绍之前需要明确下java中的每一个类的对象实例都有且只有一个锁(lock)和之相关联,synchronized关键字只作用于该锁,即可以认为synchronized只对java类的对象实例起作用。
synchronized修饰函数
1、synchronized锁定的是调用这个同步方法的对象实例,举个例子,同一个实例p1在不同线程中都调用amethod时会产生同步;
2、需要注意的是这个对象所属的类的另一对象p2却能够任意调用这个amethod,因为不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的amethod方法;
3、如果一个对象有多个synchronized方法,比如amethod、bmethod、cmethod,现在只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法。
上述代码其实等价于下面:
synchronized修饰代码块
synchronized修饰静态方法
前面提到了synchronized关键字只对不同线程中的p1实例有效,那如何可以同时对p1和p2不同实例有效呢,答案就是使用synchronized修饰静态方法,类的静态方法可以说是这个类自有的,并不依赖类的实例,所以我们只要对类的静态方法使用synchronized关键字来修饰就可以达到不同实例间的同步了。
如对本文有疑问, 点击进行留言回复!!
springmvc之ResponseBody响应json数据遇到的错误及解决
uni-app 后台升级 静默升级 uniapp 后台更新 静默更新 在线升级
SpringBoot多Module启动报错Could not transfer metadata
Hibernate项目报错:Cannot call sendError() after the response has been committed
网友评论