1 线程八锁
问题引入:
判断打印的是“one” 还是 “two”
- 1 两个普通同步方法,两个线程,标准打印
- 打印结果
One Two
- 打印结果
package JUC;
/**
* 线程八锁:第一锁——两个普通同步方法,两个线程,标准打印
*
* @author Yorick
*
*/
public class TestThreadMoniter {
public static void main(String[] args) {
Number number = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
number.getTwo();
}
}).start();
}
}
class Number {
public synchronized void getOne() {
System.out.print("One");
}
public synchronized void getTwo() {
System.out.print("Two");
}
}
- 2 在
getOne()
方法中追加Thread.sleep()
- 打印结果(延迟三秒后打印)
One Two
- 打印结果(延迟三秒后打印)
public synchronized void getOne() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("One");
}
- 3 Number类中新增普通方法
getThree()
- 打印结果
Three(延迟三秒后)One Two
- 打印结果
public void getThree() {
System.out.print("Three");
}
- 4 两个普通同步方法,两个Number对象
- 打印结果
Two (延迟三秒) One
- 打印结果
public class TestThreadMoniter {
public static void main(String[] args) {
Number number = new Number();
Number number2 = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
number2.getTwo();
}
}).start();
}
}
- 5 修改
getOne()
为静态方法,同一个number对象进行调用- 打印结果
Two (延迟三秒) One
- 打印结果
public static synchronized void getOne() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("One");
}
- 6 修改
getOne()
和getTwo()
两个方法均为静态方法,同一个number对象进行调用- 打印结果
(延迟三秒)One Two
- 打印结果
class Number {
public static synchronized void getOne() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("One");
}
public static synchronized void getTwo() {
System.out.print("Two");
}
}
- 7 一个静态同步方法(
getOne()
),一个非静态同步方法(getTwo()
),两个number对象进行调用(number调用getOne()
,number2调用getTwo()
)- 打印结果
Two (延迟三秒) One
- 打印结果
package JUC;
/**
* 线程八锁
*
* @author Yorick
*
*/
public class TestThreadMoniter {
public static void main(String[] args) {
Number number = new Number();
Number number2 = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
number2.getTwo();
}
}).start();
}
}
class Number {
public static synchronized void getOne() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("One");
}
public synchronized void getTwo() {
System.out.print("Two");
}
}
- 8 两个静态方法,两个number对象进行调用
- 打印结果
(延迟三秒) One Two
- 打印结果
package JUC;
/**
* 线程八锁:第一锁——两个普通同步方法,两个线程,标准打印
*
* @author Yorick
*
*/
public class TestThreadMoniter {
public static void main(String[] args) {
Number number = new Number();
Number number2 = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
number2.getTwo();
}
}).start();
}
}
class Number {
public static synchronized void getOne() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print("One");
}
public static synchronized void getTwo() {
System.out.print("Two");
}
}
2 线程八锁的关键
- 非静态方法的锁默认为
this
,静态方法的锁为对应的Class实例 - 某一个时刻内,只能有一个线程有锁,无论几个方法