百天打卡第三天-线程安全

synchronized 关键字初识

下面这三句话背下来面试很受用
1synchronize关键字提供了一种锁的机制,能够确保共享变量的互斥访问,从而防止数据不一致的问题出现。
2synchronize关键字包括monitor enter 和monitor exit两个jvm指令,它能够保证在任何时候任何线程执行到monitor enter成功之前都必须从主内存中获取数据,而不是从缓存中,在monitor exit运行成功之后,共享变量被更新后的值必须刷入主内存。
3synchronize的指令严格遵守java happens-before规则,一个monitor exit指令之前必定要有一个monitor enter。

synchronized 关键子的用法

synchronize 关键字可以对代码块或方法进行修饰,而不能够对于class以及变量进行修饰。

synchronized 需要注意的问题:

接下来的部分也背下来吧,蛮有用的

1与monitor 关联的对象不能为空

❎错误程序❌

private final Object mutex = null ;
public void syncMethod () {
	synchronized(mutex){
	//
	}
}

mutex为null是个低级错误,每个对象和一个monitor关联,对象都为null,monitor更无从谈起了。

2synchronize 的作用域太大

❎错误程序❌
public static class Task implements Runnable {
	@Override
	public synchronized void run (){
	//
	}
}

synchronized 关键字应该尽可能的作用域共享资源(数据)的读写作用域。

3 不同的monitor 企图锁相同的方法

❎错误程序❌
public static class Task implements Runnable {
	private final Object MUTEX = new Object() {
		@Override
		public void run (){
			//...
			synchronized(MUTEX){
			//...
			}
		}
	}
	public static void main (String []args){
		for(int i = 0 ;i<5;i++){
			new Thread(Task::new).start();
		}
	}

}

4多个锁的交差导致死锁

多个锁交差容易造成死锁,程序没有任何错误输出,就是不工作。

...
private final Object MUTEX_READ = new Object ();
private final Object MUTEX_WRITE = new Object ();
public void read (){
	synchronized (MUTEX_READ){
		synchronized(MUTEX_WRITE){
			//...
		}
	}

}

public void wtite (){
	synchronized (MUTEX_WRITE){
		synchronized(MUTEX_READ){
			//...
		}
	}

}

This Monitor 和 ClassMonitor

this monitor

synchronized 关键字修饰了同一个实例对象的两个不同方法,那么与之对应的monitor是 this monitor ,两个monitor是一致的。

class monitor

synchronized 关键字修饰的同一个类的两个不同static 方法,那么与之对应的monitor是 class monitor ,两个monitor是一致的。

程序死锁的基本原因

1交叉锁可能导致出现死锁

线程A持有R1的锁等待R2的锁,线程B持有R2的锁等待R1的锁。

2内存不足

当并发请求系统可用内存时,如果此时系统内存不足,则可能会出现死锁的情况。 两个线程T1 and T2 ,执行某项任务,T1已经获取100M内存,T2获取200M内存,如果执行每个线程单元都需要300M内存,但是剩余可用内存刚好为200M,那么两个线程有可能都在等着彼此能释放内存资源。

3一问一答式的数据交换

服务的开启某个端口等待客户端访问,客户端发送请求立即等待接收服务端给的相应,由于某种原因服务端错过了客户端发送的信息,这时服务端与客户端都等待彼此发送信息过来,造成死锁。

4数据库

行级锁和表级锁。

5文件锁

某个进程一直占用某个文件,或者占用后没有及时关闭资源都会造成其他线程的死锁。

6死循环引起的死锁
代码处理不当进入死循环陷入假死状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个双鱼座的测开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值