Synchronized原理
创新互联建站长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为管城企业提供专业的成都网站设计、成都网站制作,管城网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
1. 什么是Synchronized
Synchronized是Java中的一种同步机制,用于保证多线程环境下的数据安全性,它可以保证在同一时刻只有一个线程能够访问被修饰的代码块或方法,从而避免数据不一致的问题。
2. Synchronized的原理
2.1 对象头和Mark Word
在JVM中,每个对象都有一个对象头,对象头中包含一个Mark Word,用于存储对象的HashCode、GC分代年龄、锁标志位等信息,当一个线程获取到对象锁时,会在Mark Word中记录当前线程的唯一标识,表示该对象已被锁定。
2.2 Monitor(监视器)
每个对象都关联一个Monitor,当一个线程进入synchronized修饰的代码块时,它会尝试获取对象的Monitor,如果Monitor已经被其他线程获取,那么当前线程会进入等待队列,直到Monitor被释放。
2.3 锁升级
Java中的锁有四种状态,分别是无锁、偏向锁、轻量级锁和重量级锁,随着竞争情况逐渐激烈,锁会由偏向锁升级到轻量级锁,再升级到重量级锁。
2.3.1 偏向锁
当一个线程第一次访问一个同步块时,会将对象头中的Mark Word设置为当前线程的唯一标识,并将锁标志位设置为偏向锁,这样下次该线程再次访问同步块时,就无需再次获取锁,提高了性能。
2.3.2 轻量级锁
当有其他线程尝试获取同一个对象的锁时,会检查对象头中的Mark Word是否为当前线程的唯一标识,如果不是,则尝试使用CAS(Compare and Swap)操作将Mark Word替换为当前线程的唯一标识,如果CAS操作成功,表示获取到了锁;否则,表示发生了竞争,需要将锁升级为重量级锁。
2.3.3 重量级锁
当发生竞争时,锁会升级为重量级锁,此时,线程会进入等待队列,直到Monitor被释放。
3. Synchronized的使用场景
Synchronized可以用于修饰方法或者代码块,保证同一时刻只有一个线程能够访问被修饰的部分,常见的使用场景包括:
保证原子性操作:对共享变量的自增操作。
保证可见性:多个线程共享一个资源,需要保证一个线程对资源的修改对其他线程可见。
保证有序性:多个线程按照一定的顺序执行任务。
4. Synchronized的优缺点
4.1 优点
简单易用:只需在方法或代码块前加上synchronized关键字即可。
保证了数据的一致性和可见性。
4.2 缺点
性能较低:当竞争激烈时,会导致大量的线程阻塞,降低系统性能。
可能导致死锁:当多个线程互相等待对方释放锁时,可能导致死锁。
网站标题:synchronzed原理
当前网址:http://www.stwzsj.com/qtweb/news30/1730.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联