Java多线程-(8)线程同步、锁、死锁

一、线程同步、锁

至于怎么用或者原理就不做太多讲述了,只总结了下要注意的点:

1、Java中每个对象都有一个内置锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步?

2、非静态的synchronized同步方法上时,获得方法所在类的当前实例(this实例)的锁

3、静态方法同步,需要一个用于整个类对象的锁,这个对象是就是这个类(XXX.class)

4、如果实例拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制

5、线程Sleep时,它所持的任何锁都不会释放

6、同步损害并发性,应该尽可能缩小同步范围

看一个例子:


看这个例子,有篇文章中说,这两种方式没有任何的区别,从宏观上看确实没有区别(区别不大),因为它俩锁定的对象是一样的,但是要注意的是下面的方法在jvm里是有一个方法压栈的操作。


二、线程死锁

其实死锁理解起来还是比较容易的,就是:当两个线程或者多个线程在互相等待对方已经锁定的资源时就产生了

通过下面这段代码就比较容易理解了:

public int read() { 
        synchronized (resourceA) { 
        	...
            synchronized (resourceB) { 
            	...
            } 
        } 
    } 

    public void write(int a, int b) { 
        synchronized (resourceB) { 
        	...
            synchronized (resourceA) { 
            	...
            } 
        } 
    }
当一个线程执行到read()方法中的第一个“...”,另外一个线程恰好执行到write()方法的第一个“...”时就发生死锁了。


相关引用:

http://lavasoft.blog.51cto.com/62575/27069

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值