synchronized关键字详解

非线程安全指多个线程对同一个对象中的实例变量进行并发访问时所得到的数据是“脏数据”。
实例变量访问
如果是方法内部的私有变量,则不存在“非线程安全”问题;
如果都个线程同时访问1个对象中的实例变量,则有可能出现“非线程安全”问题;
关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作帧,即:哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,其他线程只能处于等待状态,前提是多个线程访问的是同一个对象。但如果多个线程访问的是多个对象,则JVM会创建多个锁。
调用用关键字synchronized声明的方法一定是排队运行的,只有共享资源的读写访问才需要同步化,如果不是共享资源则不需要同步化。
synchronized锁重入
关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到该对象的锁。如果不可锁重入的话,就会造成死锁。
当存在父子类继承关系时,子类是完全可以通过“可重入锁”调用父类的同步方法的。
出现异常,锁自动释放
当一个线程执行的代码出现异常时,其所持有的锁会自动释放。
同步不具有继承性
synchronized同步语句块
同步语句块主要是解决同步方法串行执行时间较长的问题。
当两个并发线程访问同一个对象中的synchronized(this)同步代码块时,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块才能执行该代码块。
synchronized(this) {
}
将任意对象作为对象监视器
Java还支持对“任意对象”作为对象监视器来实现同步的功能,这个任意对象大多数是实例变量及方法的参数,使用格式为synchronized(非this对象),主要作用是:
多个线程持有“对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象)同步代码块中的代码。
锁非this对象具有一定的优点:如果在一个类中有很多个synchronized方法,这时虽然能实现同步,但会受到阻塞,影响运行效率;但如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序与同步方法是异步的,不与其他锁this同步方法争抢this锁,则可大大提高运行效率。
静态同步synchronized方法与synchronized(class)代码块
synchronized应用在static静态方法上,是对当前的.java文件对应的class类进行持锁,而加到非static方法上是给对象加锁。
同步synchronized(class)代码块的作用和synchronized static方法的作用一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值