1.使用方式
Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:
(1)修饰普通方法(2)修饰静态方法
(3)修饰代码块
2.三种使用方法的示例:
public class LockTest {
public static void main(String[] args) {
// 类锁和对象锁
Parameter params = new Parameter();
Thread t1 = new InnerClass(params);
Thread t2 = new InnerClass(params);
t1.start();
t2.start();
}
public static class InnerClass extends Thread {
private Parameter params;
public InnerClass(Parameter params) {
this.params = params;
}
@Override
public void run() {
params.sayHello();
params.sayGoodBye();
}
}
}
/**
* 这个类为了模拟多线程下多同一个资源的操作
* @author sniper
*
*/
class Parameter {
//这里如果加上static表示静态方法,属于类级别,如果没有static表示对象的,必须初始化好类才能使用
public synchronized static void sayHello() {
// public synchronized void sayHello() {
System.out.println(Thread.currentThread().getName() + " say hello! before");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " say hello! after");
}
public void sayGoodBye() {
//下面这个如果锁住this,表示锁住的是当前对象,属于对象锁,如果锁Paramster.class,则是一个类锁,两个其实不一样
// synchronized (this) {
synchronized (Parameter.class) {
System.out.println(Thread.currentThread().getName() + " say good bye! before");
System.out.println(Thread.currentThread().getName() + " say good bye! in lock");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " say good bye! after");
}
}
}
3.理解:synchronized在静态方法里面实际上使用的是类锁,类其实本身也是一个对象
synchronized在非静态方法里面实际上使用的是对象自己的锁,如果多线程同时使用这个带有synchronized关键字的非静态方法,那么他们会阻塞
synchronized锁住代码块的时候,其实也是需要传入一个对象,多线程同时使用这个同步代码块时也会阻塞
synchronized的这三种使用方法实际上都是锁住了一个对象。