Java多线程02之synchronized

synchronized

提示:本系列文章学习Java多线程相关知识


前言

多线程程序的评量标准:
安全性:不损坏对象,使用线程安全的类
生存性:进行必要的处理,避免死锁
复用性:可再利用类


一、synchronized是什么?

synchronized:加锁机制,当有一个线程正在执行synchronized方法时,其他线程无法执行该方法,这是简单型的共享互斥,实现了线程间的同步
还可以保证线程间的可见性和有序性,从可见性的角度上讲,synchronized完全可以替代volatile的功能,只是使用上不太方便
有序性:被synchronized限制的多个线程是串行执行的

二、synchronized使用

1.同步方法和同步代码块

如何加锁,以及他们的锁对象是什么

静态同步方法加锁:静态同步方法使用的锁肯定不是this,因为静态方法中不可以定义this。静态随着类的加载而加载,这时有可能内容还没有该类对象对象。但是一个类加载进内存,会先将这个类对应的字节码文件封装成对象。
该对象的表示方式类名.class代表一个类字节码文件对象,该对象在内存中是唯一的。
同步方法加锁:this,注意继承方式创建线程时,由于this对象是变化的,所以不要使用此种写法。
同步代码块加锁:任意对象,注意当传入this对象时,不能使用继承方式创建线程。

某种意义上,同步方法和同步代码块是可以互相替换的

  • synchronized实例方法【同步方法加锁】和synchronized阻挡同步代码块
public synchronized void m(){} = synchronized (this) {	//该对象可以是任意对象,一般会将当前对象this作为同步对象
 	//需要被同步的代码
}
  • synchronized类方法【静态同步方法加锁】和synchronized阻挡同步代码块
public synchronized static void m(){} = synchronized (Clazz.class) {
	//需要被同步的代码
}

2.同步带来的问题

由于顺序执行效率太低,不能有效利用cpu资源––>出现多线程––>多线程出现安全问题(操作共享数据和多条线程操作代码)––>同步––>同步代码块和同步方法––>引发死锁––>死锁的排除和解决

同步好处
同步的出现解决了多线程的安全问题。

同步弊端
1、因为多个线程每次都要判断这个锁,所以效率会降低。最新的synchronized具有锁升级特性(偏向锁–>轻量级锁–>重量级锁,锁升级
2、容易引发死锁。

3.应用

  • 单例模式:双重锁校验
  • 与AQS相比,synchronized同时只能与一个共享变量的notify或wait方法实现同步,而AQS的一个锁可以对应多个条件变量

总结

加入了同步,安全问题依然存在。因为同步是有前提的:
同步前提:
1,必须是两个或者两个以上的线程才需要同步。
2,必须要保证多个线程使用的是同一个锁,才可以实现多个线程被同步。
如果出现加上同步安全问题依然存在,就按照两个前提来排查问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值