关于synchronized关键字:
一句话说出Synchronized的作用
能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。
Synchronized的地位
- Synchronized是Java的一个关键字
- 是最基本的互斥同步的手段
- 是并发编程中的元老级角色,是并发编程的必学内容
Synchronized的两种用法介绍
对象锁,包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)。
类锁,指synchronized修饰静态的方法或指定锁为Class对象。
第一个用法:对象锁
代码块锁
代码块形式:手动指定锁对象
锁对象的选取:若不特定锁对象,可以用this(当前对象)作为我们的锁。
例子如下:
Object的对象o放在堆里的,在堆上加了锁,当有线程访问这个对象,并想执行最后两个语句时,应该首先要拿到这个锁,然后进行访问,当第二个线程过来想拿锁的时候,应该是第一个线程执行完之后,把锁释放。锁的互斥。
方法锁形式
synchronized修饰普通方法(非静态方法),锁对象默认为this
这两种是一样的,锁定的是this对象,不是锁定整段代码。
synchronized锁定是一个对象,而不是代码块。
第二个用法:类锁
类锁的概念
概念:Java类可能有很多对象,但只有一个Class对象
本质:所谓的类锁,就是Class对象的锁
用法和效果:类锁在同一时刻只能被一个对象拥有
形式一:synchronized加在static方法上
形式二:synchronized(*.class)代码块
这里写synchronized(this)是不可以,静态的属性和方法是不需要new出对象进行访问的
是new了一个对象,多个线程一起访问这个对象
5个线程可能会出现线程重复的问题。这个时候是没有锁的,可能存在一个线程还没有访问完,另外一个线程又来了。
加上锁,上述问题就不存在了。加上synchronized之后,这个代码块是原子操作,不可分的。