版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
synchronized是保证多线程同步执行的关键字,它的用法有以下几种
public class ClassA {
//放在方法 所得是对象 和 synchronized(this)是一样的
public synchronized void lockMethod() {
System.out.println(Thread.currentThread().getName()+"\t 111 lockMethod");
}
public void lockMethod_CodeBlockByThis() {
//代码块 this锁的是对象
synchronized(this) {
System.out.println(Thread.currentThread().getName()+"\t 222 lockMethod_CodeBlockByThis");
}
}
public void lockMethod_CodeBlockByClass() {
//代码块 Class锁的是类,无论任何地方,任何类只要是锁的是同一个class,并发时都会等待
synchronized(ClassA.class) {
System.out.println(Thread.currentThread().getName()+"\t 333 lockMethod_CodeBlockByClass");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//放在静态方法上,锁的是当前的class,此处的锁和synchronized(ClassA.class)是同样的
public synchronized static void lockStaticMethod() {
System.out.println(Thread.currentThread().getName()+"\t 444 lockStaticMethod");
}
}
如上代码中:
lockMethod()和lockMethod_CodeBlockByThis()是方法锁;
lockStaticMethod()和lockMethod_CodeBlockByClass()是类锁;
方法锁与方法锁互斥,类锁与类锁互斥。
测试类
public class TestThread {
public static void main(String[] args) {
ClassA a = new ClassA();
ClassC c = new ClassC();
for (int i = 1; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
a.lockMethod();
}
}, "thread01-----").start();
new Thread(new Runnable() {
@Override
public void run() {
a.lockMethod_CodeBlockByThis();
}
}, "thread02=============").start();
new Thread(new Runnable() {
@Override
public void run() {
a.lockMethod_CodeBlockByClass();
}
}, "thread03>>>>>>>>>>>>>>>>>>>>>>>>").start();
new Thread(new Runnable() {
@Override
public void run() {
a.lockStaticMethod();
}
}, "thread04********").start();
new Thread(new Runnable() {
@Override
public void run() {
c.lockMethod_CodeBlockByClass();
}
}, "thread05 》》》》》》 ").start();
}
}
}
在其他方法中使用ClassA加锁
public class ClassC {
public void lockMethod_CodeBlockByClass() {
synchronized (ClassA.class) {
System.out.println(Thread.currentThread().getName() + "\t CCC ClassC lockMethod_CodeBlockByClass");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}