1.什么是synchronized?
Synchronized是Java关键字,是一种同步锁。
可以理解为:当一个方法等使用这个关键字修饰时,同一时刻只能存在一个线程执行被修饰的代码,如果存在其他线程也需要执行这个被修饰的代码,那么其他线程必须等待当前线程执行完成被修饰的代码后才能执行该被修饰的代码。
注意:当一个线程访问对象的一个加锁代码块时,另一个线程仍可以访问该对象中的非加锁代码块。
2.synchronized可以修饰哪些对象以及如何使用?
synchronized可以修饰对象一般为以下几种:
(1)修饰代码块
????????a.被修饰的代码块称为同步语句块
????????b.作用范围:synchronized修饰的大括号中的代码
? ? ? ? c.作用对象:调用这个代码块的所有对象
? ? ? ? d.示例:
? ? ? ? ? ? ? ? public void method(int i){
? ??????????????????synchronized(this){
? ? ? ? ? ? ? ? ? ? ? ? i++;
????????????????????}
????????????????}
(2)修饰方法
????????a.普通方法
? ? ? ? ? ? (a)被修饰的方法叫做同步方法
? ? ? ? ? ? (b)作用范围:被修饰的整个方法
? ? ? ? ? ? (c)作用对象:调用这个被修饰方法的对象
? ? ? ? ? ? (d)示例:
? ? ? ? ? ? ? ? ? ? public synchronized void method(int i){
????????????????????????????i++;
????????????????????}
????????b.静态方法
????????????(a)被修饰的静态方法叫做同步静态方法
????????????(b)作用范围:被修饰的整个静态方法
????????????(c)作用对象:被修饰方法所属类的所有对象(存在线程在该类进行操作时,其他线程在该类的所有对象上的操作都不能进行)
? ? ? ? ? ? (d)示例:
? ??????????????????public static synchronized void method(int i){
????????????????????????i++;
????????????????????}
(3)修饰类
? ? ? ? a.被修饰的类叫做同步类
? ? ? ? b.作用范围:被关键字修饰的后面大括号中的代码
? ? ? ? c.作用对象:被修饰类的所有对象
? ? ? ? d.示例:
? ? ? ? ? ? public? class ClassName {
????????????????? public void method() {
? ? ? ????????????????synchronized(ClassName.class) {
? ? ? ? ? ? ? ? ? ? ? ?}
????????????????? }
????????????}