synchronized同步锁的使用:
synchronized是Java中的关键字,是一种同步锁。
synchronized可以对类的对象加锁也可以对类的class对象加锁;
对类的class对象加锁时是全局唯一的所有对该类的对象操作的线程都需要等待锁资源的释放;
对类的对象加锁时,只有对该类同一个对象操作的线程才需要等待锁资源的释放。
代码示例:
package cc.zxf.owner.utils;
/**
* class对象锁全局唯一,对象锁只锁对同一个对象的操作
*/
public class SynTest {
/**
* 启动class对象锁的线程
*/
private static class SynClass implements Runnable{
@Override
public void run() {
System.out.println("启动class对象锁线程:"+Thread.currentThread().getName());
synClass();
}
}
/**
* 启动对象锁的线程
*/
private static class InstanceClass implements Runnable{
private SynTest synTest;
public InstanceClass(SynTest synTest){
this.synTest = synTest;
}
@Override
public void run() {
System.out.println("启动对象锁线程:"+Thread.currentThread().getName());
synTest.instanceClass();
}
}
/**
* class对象锁
*/
private synchronized static void synClass(){
System.out.println("class对象锁开始!!!");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("class对象锁结束!!!");
}
/**
* 对象锁
*/
private synchronized void instanceClass(){
System.out.println("对象锁开始!!!");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("对象锁结束!!!");
}
public static void main(String[] args){
SynTest synTest1 = new SynTest();
SynTest synTest2 = new SynTest();
SynClass synClass = new SynClass();
InstanceClass instanceClass1 = new InstanceClass(synTest1);
InstanceClass instanceClass2 = new InstanceClass(synTest2);
Thread thread1 = new Thread(instanceClass1);
Thread thread2 = new Thread(instanceClass2);
thread1.start();
thread2.start();
}
}
说明:
1. 若修饰一个代码块,作用的对象是调用这个代码块的对象;
2. 若修饰一个方法,作用的对象是调用这个方法的对象;
3. 若修饰一个静态的方法,作用的对象是这个类的所有对象。