非静态方法的锁为this,静态方法锁为Class实例

2025-06-21 22:58:12

1、新建Java类演示两个普通同步方法,两个线程打印的顺序。Number非静态方法的锁默认为this,同一个时刻拥有的是同一把锁,打印为one,twopackage com.gwolf;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("tow"); }}

非静态方法的锁为this,静态方法锁为Class实例

2、运行程序,查看执行的结果是one,tow,这个结果说明Number非静态方法的锁默认为this,同一个时刻拥有的是同一把锁。

非静态方法的锁为this,静态方法锁为Class实例

3、现在新增Thread.sleep()给getOne(),Number非静态方法的锁默认为this,同一个时刻拥有的是同一把锁,尽管getOne()方法休眠了三秒,打印还是为one荑樊综鲶,twopackage com.gwolf;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() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("one"); } public synchronized void getTwo() { System.out.println("tow"); }}

非静态方法的锁为this,静态方法锁为Class实例

4、在Number中增加一个普通的方法getThree() ,普通方法没有锁,结果最新龅歧仲半打印。package com.gwolf;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(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("one"); } public synchronized void getTwo() { System.out.println("tow"); } public void getThree() { System.out.println("three"); }}

非静态方法的锁为this,静态方法锁为Class实例

5、查看程序执行结果:three,tow,one。Number非静态方法的锁默认为this,同一个时刻拥有的是同一把锁,首先打印另外一个对象的three,然后打印为one,two

非静态方法的锁为this,静态方法锁为Class实例

6、在main方法中创建两个对象时是两把同步锁,getOne方法休眠了三秒,所以首先打印的是Two,然后打印onepublic 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();

非静态方法的锁为this,静态方法锁为Class实例
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢