JUC学习之线程8锁
程序员文章站
2022-05-22 12:33:45
...
本文为看视频学习资料,若有错误,请指正,谢谢!
介绍线程8锁围绕一个题目展开,题目:打印的是“one”还是“two”?
1.两个普通同步方法,两个线程,打印?
public class TestThread8Monitor {
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.println("one");
}
public synchronized void getTwo(){
System.out.println("two");
}
}
结果:2.新增Thread.sleep()给getOne()方法,打印?
public synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
}
结果:延迟3秒后
3.新增普通方法getThree(),三个线程,打印?
public class TestThread8Monitor {
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();
new Thread(new Runnable() {
@Override
public void run() {
number.getThree();
}
}).start();
}
}
class Number{
public synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
}
public synchronized void getTwo(){
System.out.println("two");
}
public void getThree(){
System.out.println("three");
}
}
结果:先打印three,然后延迟3秒,打印one,two
4.两个普通同步方法,两个Number对象,打印?
public class TestThread8Monitor {
public static void main(String[] args){
Number number = new Number();
Number number1 = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
number1.getTwo();
}
}).start();
// new Thread(new Runnable() {
// @Override
// public void run() {
// number.getThree();
// }
// }).start();
}
}
class Number{
public synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
}
public synchronized void getTwo(){
System.out.println("two");
}
// public void getThree(){
// System.out.println("three");
// }
}
结果:5.将getOne()方法设置成static,一个对象,两个线程,打印?
public static synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
}
结果:6.修改两个方法均为static方法,一个number对象,打印?
public static synchronized void getTwo(){
System.out.println("two");
}
结果:延迟3秒后打印7.一个static同步方法,一个非static同步方法,两个对象,打印?
public class TestThread8Monitor {
public static void main(String[] args){
Number number = new Number();
Number number1 = new Number();
new Thread(new Runnable() {
@Override
public void run() {
number.getOne();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
number1.getTwo();
}
}).start();
}
}
class Number{
public static synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
}
public synchronized void getTwo(){
System.out.println("two");
}
}
结果:打印two之后延迟3秒打印one8.两个static同步方法,两个Number对象,打印?
public static synchronized void getTwo(){
System.out.println("two");
}
结果:延迟3秒打印one,two线程八锁的关键:
1.在某一时刻,只有一个线程能够持有锁,无论有几个方法。
2.非static方法的锁默认为this,static的锁是Class实例。
上一篇: Java集合--Set集合接口
下一篇: Java集合--集合输出