博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
synchronized之类锁和实例锁
阅读量:4112 次
发布时间:2019-05-25

本文共 1949 字,大约阅读时间需要 6 分钟。

synchronized可以修饰代码块和方法,方法又分为静态方法和普通方法,那么一言概之:线程执行的时候当有synchronized时,他获取的是类锁或实例锁然后才能执行。

代码准备:

构造四类同步方法:

public synchronized void a() {	System.out.println("a");	try {		Thread.sleep(10000l);	} catch (InterruptedException e) {		e.printStackTrace();	}}public synchronized void b() {	System.out.println("b");}public static synchronized void c() {	System.out.println("static c");	try {		Thread.sleep(10000l);	} catch (InterruptedException e) {		e.printStackTrace();	}}public static synchronized void d() {	System.out.println("static d");}

通过sleep来实现操作差

 

案例1:如果某一对象有多个同步方法,那么其只能排队访问其对应的同步方法,因为此时是对象锁

public static void testInstance1() {	final ThreadTest t1 = new ThreadTest();	new Thread(new Runnable() {		@Override		public void run() {			t1.a();		}	}, "T1").start();	new Thread(new Runnable() {		@Override		public void run() {			t1.b();		}	}, "T2").start();}

输出:

a

然后开始等待,方法a执行完之后输出b

 

案例2:多个实例,访问各自不同的同步方法时不受影响:

public static void testInstance2() {	final ThreadTest t1 = new ThreadTest();	final ThreadTest t2 = new ThreadTest();	new Thread(new Runnable() {		@Override		public void run() {			t1.a();		}	}, "T1").start();	new Thread(new Runnable() {		@Override		public void run() {			t2.b();		}	}, "T2").start();}

输出:

a

b

方法a未执行结束

 

案例3:当同步访问静态方法和非静态方法时不受影响,因为他们是两个不同的锁,静态方法是类锁而非静态方法为实例锁:

public static void testInstance3() {	final ThreadTest t1 = new ThreadTest();	new Thread(new Runnable() {		@Override		public void run() {			t1.a();		}	}, "T1").start();	new Thread(new Runnable() {		@Override		public void run() {			ThreadTest.c();		}	}, "T2").start();}

输出:

a

static c

而a方法未执行结束,实例锁未释放

 

案例4:当并发访问两个非静态方法是需要同步等待:

public static void testInstance4() {	new Thread(new Runnable() {		@Override		public void run() {			ThreadTest.c();		}	}, "T2").start();	new Thread(new Runnable() {		@Override		public void run() {			ThreadTest.d();		}	}, "T1").start();}

输出:

static c

等c执行完成之后释放了类锁之后输出static d

 

结论:

1.静态方法锁的是类,而非静态方法锁的是当前的实例,两把不同的锁互不影响;2.类锁只有一把,而不同的实例其锁不同;3.静态代码块效果等同;

 

 

 

转载地址:http://snqsi.baihongyu.com/

你可能感兴趣的文章
记CSDN访问量10万+
查看>>
Linux下Oracle数据库账户被锁:the account is locked问题的解决
查看>>
极客算法训练营学习笔记(一)
查看>>
记CSDN访问20万+
查看>>
Windows 环境下Webstorm 2020.3 版本在右下角找不到Git分支切换部件的一种解决方法
查看>>
Electron-Vue项目中遇到fs.rm is not a function问题的解决过程
查看>>
飞机换乘次数最少问题的两种解决方案
查看>>
有向无回路图的理解
查看>>
设计模式中英文汇总分类
查看>>
MFC实现五子棋游戏
查看>>
WPF实现蜘蛛纸牌游戏
查看>>
单例模式
查看>>
工厂方法模式
查看>>
模板方法模式
查看>>
数据结构之队列、栈
查看>>
数据结构之树
查看>>
数据结构之二叉树
查看>>
二叉树非递归遍历算法思悟
查看>>
红黑树算法思悟
查看>>
从山寨Spring中学习Spring IOC原理-自动装配注解
查看>>