多线程同步的几种实现方法

Synchronized关键字

在Java语言中,每一个对象都有一个对象锁与之关联,该锁表明对象在任何时候只允许被一个线程所拥有,当一个线程调用对象一段synchronized代码时,首先需要获取这个锁,然后去执行相应代码,执行结束后,释放锁。

Synchronized主要有synchronized方法和synchronized块,此外该关键字还可以用于静态方法、类或实例中。

Synchronized方法:在方法声明前加入synchronized关键字。只要把多线程访问的资源的操作放在该方法中,就能保证这个方法在同一时刻只能被一个线程访问,从而保证了多线程访问的安全性。然而,当一个方法的方法体规模非常大时,把该方法会大大影响程序的执行效率。为了提高效率,需要用synchronized块。

Synchronized块:把任意代码段声明为synchronized,也可以指定上锁对像。


Waitnotify

当用synchronized修饰某个共享资源的时候,如果线程A1在执行synchronized代码,另外一个线程A2也要同时执行同一对象的同一synchronized代码时,线程A2将要等到A1执行完后,才能继续执行。在这种情况下需要wait与notify。

在synchronized代码时,线程可以调用对象的wait,释放对象锁,进入等待状态,并且可以调用notify方法或notifyAll方法通知正在等待的线程。

 

注意

尽可能减少synchronized块内代码,只把临界区的代码放到synchronized块中,尽量避免使用synchronized来修饰整个方法。

给每个线程都定义一个线程的名字,不要使用匿名线程,这样有利于代码维护与调试

用concurrent容器(ConcurrentHashMap)来代替synchronized容器(Hashtable)。因为synchronized容器使用synchronized关键字通过对整个容器加锁来实现多线程安全,性能比较低。而ConcurrentHashMap采用更加细粒度的锁,因此可以支持更高的并发。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值