`

Java中Synchronized的使用注意事项

阅读更多
转自:http://www.blogjava.net/freeman1984/archive/2011/10/17/361403.html
在Java1.5之前,synchronized应该是最常用的java支持并发手段。那synchronized是怎么做到的了,从java1.0开始,java中的每个对象就一个内部锁。如果一个类的方法被synchronized关键字所修饰,那么这个对象的锁将保护整个方法。举例来说:

public synchronized void method(){

    method body

}

等价于
public void method(){

    this.intrinsicLock.lock();

    try{

        method body;

    }finally(){

        this.intrinsicLock.unlock();

    }

}


从上面的代码示例可以看出,synchronized的使用方式是比较简单的。这也导致了大量的初学者在碰到java编程的时候落入陷阱里,认为既然synhronized可以搞定一切,那么不管三七二十一,只要有并发可能性的地方,就加上synchronized的关键字,这显然是不对的。在java对象中,这个java对象只有这一个内部锁,其中一个synchronized方法获取到了这个锁,另外一个synchronized方法的调用将被阻塞。即
class sync{

    public synchronized void methodA(){};

    public synchronized void methodB(){};

    ... ...

}

methodA 和methodB在初始就是互斥的,如果methodA和methodB进入互相等待,就很容易出现死锁的情况。那如果碰到这种情况,应该怎么做了?常用的方式是在方法内部新建一个无意义的对象,然后对这个无意义的对象加同步锁。
public class Sync {  
    private int i;  
      
    public void plus(){  
        Object dummy = new Object();  
        synchronized(dummy){  
            i++;  
        }  
    }  
      
    public void minus(){  
        Object dummy = new Object();  
        synchronized(dummy){  
            i--;  
        }         
    }  
}  
 
需要注意的是:将静态类声明为synchronized方法也是合法的。举例来说,如果Sync有一个static synchronized方法,那么这个方法被调用时,Sync.class这个类对象本身在jvm中将被锁住。
分享到:
评论

相关推荐

    java里面synchronized用法.doc

    五、synchronized 关键字的注意事项 1. 确定 synchronized 关键字取得的锁是对象,而不是代码块或函数。 2. 每个对象只有一个锁与之相关联。 3. 实现同步可能会产生系统开销,甚至可能造成死锁,因此应尽量避免无谓...

    javasynchronized详解.pdf

    6. **注意事项**: - 锁的使用应谨慎,过度使用`synchronized`可能导致死锁、饥饿或性能下降。应尽量减小同步代码的范围,只同步必要的部分。 - `synchronized`无法解决线程间的通讯问题,比如生产者消费者问题,...

    Javasynchronized机制.pdf

    4. **注意事项**: - 同步机制虽然提供了线程安全,但也会带来性能开销,因为它可能导致线程阻塞,所以在不需要同步的情况下应避免使用。 - 死锁是多线程编程中的常见问题,使用`synchronized`不当可能会导致死锁...

    Android synchronized 测试案例

    六、注意事项 - 尽量减少`synchronized`的使用,因为它会降低程序的并发性能。 - 避免死锁,合理设计同步代码块的执行顺序。 - 使用`synchronized`时,考虑使用更细粒度的锁,提高并发性。 通过这个测试案例,...

    java的线程同步机制synchronized关键字的理解_.docx

    synchronized 的使用注意事项 1. synchronized 方法可能会对系统性能产生影响, nên尽量避免无谓的同步掌握。 2. 使用 synchronized 关键字时,需要明确对象的锁是谁的。 3. synchronized 块可以作为一种解决方法...

    Java中synchronized关键字修饰方法同步的用法详解

    5. 注意事项: - 同步方法或同步块可以避免数据不一致性的问题,但也会带来性能开销,因为它会导致线程阻塞,降低并发效率。 - 使用synchronized时,需谨慎处理死锁和活锁的问题,避免造成线程长时间等待。 - ...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    synchronized 关键字的注意事项 在使用 synchronized 关键字时,需要注意以下几点: * synchronized 关键字只能被一个线程获取,没有获得锁的线程只能等待。 * 每个实例都对应有自己的锁(this),不同实例之间...

    JAVA注意事项

    在Java编程过程中,掌握一些关键的注意事项至关重要,这不仅能提高代码质量,还能避免常见的编程陷阱。以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,...

    JAVA面试题 简谈你对synchronized关键字的理解

    下面我们将详细介绍synchronized关键字的特性、用法和注意事项。 Synchronized关键字的特性 1. 可以用来修饰方法:synchronized可以用来修饰实例方法和静态方法,以实现线程安全。 2. 可以用来修饰代码块:...

    Java并发编程常识-梁飞.rar

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。阿里大牛梁飞编写的《Java并发编程常识》PPT,深入浅出地讲解了这个主题,对开发者来...

    JAVA多线程的使用场景与注意事项总结

    JAVA多线程的使用场景与注意事项总结 Java多线程是Java语言中的一种重要机制,允许程序同时执行多个任务,以提高程序的执行效率和响应速度。在Java中,多线程可以通过继承Thread类、实现Runnable接口或使用线程池来...

    ReentrantLock 与 synchronized 简介

    4. **注意事项**: - 使用`ReentrantLock`时,必须显式地在`finally`块中释放锁,以防止由于异常而导致的锁未释放问题。 - `ReentrantLock`支持重入特性,即允许同一个线程多次获取同一把锁,这与`synchronized`的...

    Java多线程基础-02、数组定义方式一、访问、注意事项.rar

    本教程将深入讲解Java多线程的基础知识,重点关注数组的定义方式、访问方法以及在多线程环境下的注意事项。数组是Java中最基本的数据结构之一,理解如何在多线程环境下正确地操作数组对于编写高效、安全的代码至关...

    Java Thread用法 经典

    应确保每次循环中使用的锁对象相同,最好将其声明为`final`。 ```java final Object lock = new Object(); public void run() { for (int i = 0; i ; i++) { synchronized (lock) { // 同步代码 } } } `...

    java关键字的使用详情

    Java是一种广泛使用的面向对象的编程语言,其设计目标之一就是具有简单性、面向对象、健壮性、安全性等特性。...通过阅读《关键字用法总结.doc》文档,可以深入学习这些知识点的具体应用场景和注意事项。

    java将数字转换为时间格式

    #### 知识点六:注意事项 - **异常处理**:在实际开发中,应当对可能出现的异常(如`ParseException`)进行适当的处理。 - **性能考虑**:对于频繁调用的情况,可以考虑重用`SimpleDateFormat`实例以提高性能。 - *...

    java synchronized关键字的用法

    5. 使用注意事项 - 合理选择同步范围:尽量减少同步代码的粒度,只同步必要的部分,以提高并发性能。 - 避免过多使用静态 synchronized 方法,因为这可能导致大量线程竞争同一把锁,降低系统效率。 - 考虑使用 Lock ...

    java并发编程常识

    要实现基本类型的原子操作,可以使用synchronized关键字或java.util.concurrent.atomic包下的原子类。 可见性 在并发编程中,可见性指的是一个线程对共享变量的修改对另一个线程是否立即可见。Java中,使用final...

    EFFECT JAVA 中文

    9. **序列化**:讨论了对象序列化的基本原理和注意事项,包括如何处理序列化兼容性问题,以及如何声明一个类为不可序列化。 10. **集合框架**:深入分析了Java集合框架,如List、Set、Map接口和它们的实现类。讲解...

    一文精通Java中的volatile关键字

    本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字保证了当一个线程修改了共享变量的值,其他线程可以立即看到这个修改。在上述示例中,如果没有使用`volatile`,线程...

Global site tag (gtag.js) - Google Analytics