Java Synchronized

Synchronized是通过monitorenter和monitorexit两个指令(对象监视器),可以同时保证Synchronized修饰的代码块在同一时间内只能被一个线程访问,即可保证不会出现CPU时间片在多个线程间切换,即可以保证原子性;
synchronized是一种悲观锁;
Synchronized实现同步机制的原理:

为了协调多线程之间的共享数据的访问,Java虚拟机给每一个对象和类都分配了一个锁,
在同一时刻只能有一个线程可以拥有这个欸或者对象的锁。如果一个线程想要用于这个类
或者对象的锁,需要直接访问虚拟机。当一个线程向虚拟机申请某个类或者是对象的锁以
后,虚拟机会把该锁分配给这个线程,同时其他对象 不能拥有该锁。当线程不需要锁的时
候,他在把锁还给虚拟机,这时虚拟机再把锁分配给其他申请锁的线程;
类锁其实就是通过对象实现的。因为当虚拟机加载类的时候,会为这个类实例化一个
java.lang.Class对象,当你要锁住这个类的时候,其实锁住的就是其对应的Class对
象,所以能够锁住所有的对象;

多次加锁:

同一线程可以对同一个对象进行多次加锁。每个对象维护着一个记录着被加锁次数的计数
器。未被锁定的对象的计数器值为0,当一个线程获得锁之后,该计数器自增为1,当同一
个线程再次获得该对象的锁的时候,计数器再次自增。当同一个对象释放锁的时候,计数
器再次减一,当计数器为0的时候,锁被释放,其他线程可以获得该锁;

Synchronized的原子性:

由于采用加锁机制,所以在该线程执行结束之前不会有其他线程访问;

Synchronized的可见性:

在解锁之前,必须要把工作内存中的数据拷贝到主内存中,所以保证了可见性;

Synchronized的有序性:

synchronized是无法禁止指令重排和处理器的优化的;
有序性的实现原理:
与as-if-serial有关;as-if-serial保证了单线程情况下程序的执行结果不变;所以Synchronized的指令还是进行了重构,但是有一定的限制;同时synchronized的执行是单线程的,所以保证了有序性;

synchronized是一个重量级锁:

Java线程是映射到操作系统得原生线程之上,所以如果阻塞或唤醒一个线程就需要操作系统介入,需要在用户态和核心态之间切换,这种切换回消耗大量的系统资源;synchronized在同步时会导致获取锁得线程进入阻塞状态,所以说synchronized是一个重量级锁机制;

Synchronized和Lock的区别:

1.Synchronized是关键字,底层使用monitorenter和monitorexit;而wait和notify方法也依赖于monitor对象来实现,所以只有在Synchronized中才能调用这两个方法;Lock是一个接口,是API层面的锁;
2.Synchronized自动加锁和释放,Lock手动加锁和释放;
3.两者默认都是非公平锁,但是Lock可以初始化为公平锁;

synchronized关键字的三种使用方法:

1.修饰代码块,对象锁可以使用指定的对象;
2.修饰成员方法,对象锁是this对象;
3.修饰静态方法,对象锁是class对象;
对象锁一般不要用String对象;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值