Java:synchronized

Java的同步机制


1.什么时候使用同步呢?可以运用下面的同步规则

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

2.Java以提供关键字synchronized的形式,为防止资源冲突提供了内置支持。当任务要执行被synchronized关键字保护的代码片段的时候,它将检查锁是否可用,然后获取锁,执行代码,释放锁。

3.要控制都共享资源的访问,得先把它包装成一个对象,然后把所有要访问(read&&write)资源的方法用synchronized标记。例如:
synchronized void f() {/* ... */}

synchronized void g() {/* ... */}

在Java中,所有对象都自动含有单一的锁(也称监视器)。当在对象上调用任意的synchronized方法的时候,此对象都会被加锁。这时候,此对象上其他所有的synchronized方法

都只有等到前一个方法调用完毕并释放了锁之后才能被调用。也就是说,对于某一个特定的对象来说,其所有的synchronized方法共享一个锁

注意,在使用并发时,将域设置为private是非常重要的,否则,synchronized关键字就不能防止其他任务直接访问域,这样就会产生冲突。

4.一个任务可以多次获得对象的锁。如果一个方法在同一个对象上调用了第二个方法,后者又调用了同一个对象上的另一个方法,就会发生这种情况。JVM负责跟踪对象被加锁的次数,当

一个对象被解锁的时候,其计数器变为0。在一个任务第一次给对象加锁的时候,计数器变为1。每当这个相同的任务在这个对象上获得锁的时候,计数器就会递增。显然,只有先获得锁

的任务才能继续获得多个锁。每个任务离开一个synchronized方法的时候,计数器递减。当计数器为零的时候,锁被完全释放,此时别的任务就可以使用该资源。

5.对于每一个类,也有一个锁(作为类的Class对象的一部分),所以synchronized static方法可以在类的范围内防止对static数据的并发访问。

原文地址:https://www.cnblogs.com/slowalker/p/3379172.html