一、锁住对象的情况
1.代码示例
class Sync {
//锁住当前的对象
public synchronized void testSync(Thread thread){
System.out.println(thread.getName()+"开始执行");
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(thread.getName()+"完成执行");
}
}
class ThreadTest extends Thread {
private Sync sync;
public ThreadTest(Sync sync) {
this.sync = sync;
}
@Override
public void run() {
sync.testSync(this);
}
}
public class NewTest {
public static void main(String[] args) {
Sync sync = new Sync();
for (int i = 1; i <= 3; i++) {
ThreadTest threadTest = new ThreadTest(sync);
threadTest.start();
}
}
}
2.输出详情
Thread-0开始执行
Thread-0完成执行
Thread-2开始执行
Thread-2完成执行
Thread-1开始执行
Thread-1完成执行
二、锁住类的情况
1.代码示例
class Sync {
//以下两种方式都是锁住Sync类
// public void testSync(Thread thread) {
// //锁住当前的类
// synchronized (Sync.class) {
// System.out.println(thread.getName() + "开始执行");
// try {
// Thread.sleep(500);
// } catch (Exception e) {
// e.printStackTrace();
// }
// System.out.println(thread.getName() + "完成执行");
// }
// }
//锁住的是当前的类
public static synchronized void testSync(Thread thread) {
System.out.println(thread.getName() + "开始执行");
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(thread.getName() + "完成执行");
}
}
class ThreadTest extends Thread {
@Override
public void run() {
/**
* 虽然每调用一次会创建一个Sync对象,但是因为testSync方法为static,且为synchronized,锁住的是Sync类,因此当一个线程
* 进入testSync方法中,其他线程不能进入
*/
Sync sync = new Sync();
sync.testSync(this);
// Sync.testSync(this);
}
}
public class NewTest {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
ThreadTest threadTest = new ThreadTest();
threadTest.start();
}
}
}
2.输出详情
Thread-0开始执行
Thread-0完成执行
Thread-2开始执行
Thread-2完成执行
Thread-1开始执行
Thread-1完成执行
三、总结
以上只是本人学习synchronized通过代码级别上的简单演示。要理解得更深入还得继续挖掘!OK!结束!