浅谈Java多线程中的Synchronized关键字

Synchronized的作用

能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。

Synchronized是Java的关键字,被Java语言原生支持,是最基本的互斥同步手段,是并发编程中的元老级角色,是并发编程的必学内容。

Synchronized的两个用法

1.对象锁

包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)

2.类锁

指synchronized修饰静态的方法或指定锁为Class对象

3点核心思想

1.一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待

2.每个实例都对应有自己的一把锁,不同实例直接互不影响;例外:当锁对象是*.class以及synchronized修饰的static方法的时候,所有对象共用一把类锁

3.无论是方法正常执行完毕或者方法抛出异常,都会释放锁。

缺点

效率低:锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程

不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件,可能是不够的

无法知道是否成功获取到锁

可重入原理:加锁次数计数器

JVM负责跟踪对象呗加锁的次数

线程第一次给对象加锁的时候,计数变为1。每当这个相同的线程在此对象上再次获得锁时,计数会递增

每当任务离开时,计数递减,当计数为0的时候,锁被完全释放。

你可能感兴趣的:(java)