读书笔记:解决共享资源的竞争

1.基本上所有的并发模式在解决线程冲突,都采用序列化访问共享资源的方案,意味着在给定时刻只允许一个任务访问共享资源。通常就是在代码前加上一条锁的语句来实现,这就使得一段时间内只有一个任务可以运行这段代码。因为锁语句产生了一种互斥的效果,所以这种机制也称互斥量。

2.java提供关键字synchronized形式,为防止资源冲突提供了内置支持。当任务要执行synchronized关键字保护的代码,会检查锁是否可用,然后获取锁,执行代码,施放锁。

3.共享资源一般是以对象形式存在内存片段中,但也可以是文件、输入输出端口或打印机。要控制对共享资源的访问,就先把它包装进一个对象,然后把所有要访问这个资源的方法标记为synchronized。如果某一个任务对标记为synchronized的方法调用,那么这个线程从该方法返回之前,其他所有要调用这个同步方法都会被阻塞。

4.并发中,类的数据成员应该声明private,并且只能通过方法访问数据,可以把方法标记为synchronized防止资源冲突。如synchronized  void f();

5.所有的对象都自动含有单一锁,当在对象上调用其任意synchronized方法,此对象都会被加锁,这时候该对象上的其他synchronized方法 只有等到前一个方法调用完毕并释放锁喉才能调用。如果某个任务对对象调用了f方法,对于同一个对象而言,只能等到f方法被调用结束并释放了锁。对于某个特定的对象而言,其所有的synchronized方法共享同一个锁,可以防止多个任务同时访问被编码为对象内存。

6.什么时候用同步

如果你正在写一个变量,它可能接下来被另一个线程读取或正在读取一个上一次已经被另外一个线程写过的变量,必须使用同步,并且,读和写线程都必须使用相同的监视器同步

每个访问临界共享资源的方法都必须被同步,否则它们就不会正确的工作。

synchronized和显示Lock对象:

1使用synchronized关键字,需要编写的代码量少,并且用户出错的可能性会降低,因此通常只有在解决特殊问题,才显示的使用Lock对象。

2使用synchronized关键字不能尝试着获取锁且最终获取锁失败,可是使用lock对象试试

3使用lock对象可以对同步做到更细粒度的控制

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值