• 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数据的并发访问。

  • 相关阅读:
    移动互联网全新体验Andoid
    《XNA高级编程:Xbox 360和Windows》51
    《XNA高级编程:Xbox 360和Windows》47
    让FCKeditor支持多用户环境(asp.net)
    《XNA高级编程:Xbox 360和Windows》45
    《XNA高级编程:Xbox 360和Windows》46
    《XNA高级编程:Xbox 360和Windows》44
    《XNA高级编程:Xbox 360和Windows》43
    hdu 4314 Save the dwarfs 夜
    poj 3150 Cellular Automaton 夜
  • 原文地址:https://www.cnblogs.com/slowalker/p/3379172.html
Copyright © 2020-2023  润新知