深入理解synchronized

synchronized同步方法

在java开发中synchronized可以在方法上声明,如果方法上有synchronized关键字就说明该方法是同步方法,在调用该方法的时候回自动加锁,使得其他需要调用该方法的线程等待。简单的说synchronized方法时按照顺序执行的
在这里先说一下变量的安全问题,据我了解方法的局部变量为线程安全的,因为每次调用该方法时都会生成一个变量,所以不存在不同线程使用同一个变量的问题,如果是实例变量,即在类内定义的全局变量,则有可能会出现线程的安全问题,因为多个线程调用的是同一个变量。所以可能会出现数据交叉的情况。
如果想解决非线程安全的问题只需要在方法前面加上synchronized关键字即可

synchronized public void add(String name){}

该关键字加上后当此方法被调用是就会自动加锁,等到调用此方法的线程调用完毕其他的线程才可以调用该方法,这样就可以避免出现非线程安全的问题。

synchronized方法的特点

synchronized是对象锁,而不是针对方法的锁

如果你实例化两个相同对象,则在进行调用这两个相同对象的相同方法时,锁是不起作用的。

synchronized是可以锁重入的

当一个线程得到对象锁后,再次请求该对象锁时是可以直接得到的,这也就是说在一个synchronized方法内调用该类的其他synchronized方法时,是永远可以得到锁的,无需等待。

synchronized不具备继承性

当子类重写父类的synchronized方法时,如果子类不添加synchronized关键字,则该方法不具备同步性

当出现异常时,锁会自动释放

synchronized(x)代码块

首先我想说一下括号内参数X,当参数为this时表示该锁为对象锁和synchronized方法是一样的,当参数为*.class时表示该锁为类锁,即实例化的该类的所有对象共用同一个锁,当参数为其他时,表示参数相同的对象共用一个锁,特别注意,当参数用String类型创建时,注意缓存问题

String a = "a"; // 这两个常量如果用 == 来比较的话 返回值为true,因为java中如果值是一样的,多个变量的值会指向同一内存块
String b = "a";

synchronized( )来对代码块进行声明时,未被包裹的代码块是无需等待的,可以异步执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值