package com.atguigu.juc;
/*
-
线程锁的八种情况:
-
- 两个同步方法,一个对象,两个线程,分别调用 getOne()和 getTwo(), 打印? //1 2
-
- 在 getOne() 方法中添加睡眠3秒,打印? //1 2
-
- 添加非同步方法,启动三个线程,打印? // 3 1 2
-
- 创建两个对象,一个调用 getOne() 一个调用getTwo(), 打印? //2 1
-
- 将 getOne() 修改为静态同步方法,一个对象,打印? //2 1
-
- 将 getTwo() 修改为静态同步方法,一个对象,打印? //1 2
-
- 将 getTwo() 修改为非静态同步方法,两个对象, 打印? //2 1
-
- 两个静态同步方法,两个对象,打印?// 1 2
-
结论:
-
①非静态同步方法的锁为 this,静态同步方法的锁为当前类对象的 Class 实例
-
②当多个线程共享一把锁,一个特定时间点只能有一个线程执行流执行,无论几个方法。
*/
public class TestThread8Moniter {public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
ThreadDemo td2 = new ThreadDemo();new Thread(new Runnable() { @Override public void run() { td.getOne(); } }).start(); new Thread(new Runnable() { @Override public void run() { td2.getTwo(); } }).start(); /*new Thread(new Runnable() { @Override public void run() { td.getThree(); } }).start();*/
}
}
class ThreadDemo{
public static synchronized void getOne(){//ThreadDemo.class
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("1");
}
public synchronized void getTwo(){
System.out.println("2");
}
public void getThree(){
System.out.println("3");
}
}