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

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采用更加细粒度的锁,因此可以支持更高的并发。

你可能感兴趣的:(Java,Java,Web)