3.3 Synchronized原理

Java线程一共有七个状态,分别是新建,可运行,运行中,睡眠,阻塞,等待,死亡

一个线程在其生命周期内总是处于某种状态:

Ø  创建: 当一个线程对象被声明并创建后,它处于“创建”状态;

Ø  就绪:线程对象调用 start() 方法后,将进入“就绪”状态,处于“就绪”状态的线程不是立即执行,而是进入就绪队列,等待CPU;

Ø  运行:当就绪队列中具有最高优先级的就绪线程被调度并获得CPU时,便进入“运行”状态,执行 run() 方法,run 方法中定义了线程的操作和功能;

Ø  非运行:处于“运行”状态的线程可能因为某些原因 (例如人为挂起)进入“非运行”状态,让出CPU并临时中止自己的执行;

Ø  停止:线程完成了它的全部工作或调用 stop() 方法强制中止线程,线程就进入“停止”状态。

死锁的四个必要条件:

互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。

 

处理死锁的策略

1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

2.检测死锁并且恢复。

3.仔细地对资源进行动态分配,以避免死锁。

4.通过破除死锁四个必要条件之一,来防止死锁产生。

 

同步方法锁当前对象,静态同步方法锁Class对象,同步方法块锁括号里配置的对象

每个对象都有一个monitoer与之关联,并且在对象头里存储锁信息。

无锁状态、偏向锁(适用于只有一个线程访问同步块场景)、轻量级锁(始终得不到锁竞争的线程使用CPU自旋,多次失败升级为重量级锁)、重量级锁(阻塞竞争线程)

参考:http://ifeve.com/java-synchronized/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值