• Java多线程:线程同步与关键字synchronized


    一、同步的特性
    1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.
    2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blog.csdn.net/huang_xw/article/details/7318561
    3. 如果两个线程要执行一个类中的同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 参见实验2:http://blog.csdn.net/huang_xw/article/details/7318571
    4. 如果两个线程要执行一个类中的不同同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 因为一个实例对象就一把锁. 参见实验3:http://blog.csdn.net/huang_xw/article/details/7318578
    5. 不光是类实例, 每一个类也对应一把锁, 这样我们也可将类的静态成员函数声明为synchronized, 以控制其对类的静态成员变量的访问. 参见实验4: http://blog.csdn.net/huang_xw/article/details/7318588
    二、synchronized的意义
    synchronized用于多线程设计, 有了synchronized关键字, 多线程程序的运行结果将变得可以控制. synchronized关键字用于保护共享数据.
    三、synchronized实现同步的机制
    synchronized依靠"锁"机制进行多线程同步, "锁"有2种, 一种是对象锁, 一种是类锁.
    四、synchronized关键字可以修饰的对象
    1. synchronized{static方法 or 普通方法} 函数的修饰符, 就是同步方法.
    2. synchronized{修饰代码块} 可作为函数内语句的修饰符, 就是同步语句块
    3. synchronized{对象引用} 注意对象必须是线程安全的.(比如: StringBuffer在JDK1.5中是线程安全的, 而数组, ArrayList是不安全的). 参见实验5:http://blog.csdn.net/huang_xw/article/details/7318593
    附: 解决线程不安全的方法: 
    1. 如果对象是immutable, 则是线程安全的, 例如: String, 可以放心使用.
    2. 如果对象是线程安全的, 例如: StringBuffer, 则放心使用.
    3. 有条件线程安全, 对于Vector和Hashtable一般情况下是线程安全的, 但是对于某些特殊情况, 需要通过额外的synchronized保证线程安全.
    4. 使用synchronized关键字.

  • 相关阅读:
    HDU
    洛谷- P1306 斐波那契公约数
    HDU
    HDU
    POJ3321
    SPOJ
    HDU
    POJ 1236 Network of Schools
    POJ-3169 Layout (差分约束+SPFA)
    POJ-1062 昂贵的聘礼 (最短路)
  • 原文地址:https://www.cnblogs.com/xuyuanjia/p/5411388.html
Copyright © 2020-2023  润新知