`
mengyang
  • 浏览: 266537 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

java同步机制

阅读更多
    今天看到一个帖子,很早的,但是很有意义,是围绕着一段代码查错展开的,帖子地址是:http://www.iteye.com/topic/81152,里面的代码是
class Stack   
{      
    LinkedList list = new LinkedList();   
  
    public synchronized void push(Object x)   
    {   synchronized(list)   
        {   list.addLast( x );   
            notify();   
        }   
    }   
  
    public synchronized Object pop()   
    {   synchronized(list)   
        {   while( list.size() <= 0 )   
                wait();   
            return list.removeLast();   
        }   
    }   
  
}

    乍一看我除了觉的有点别扭,确实没找到什么大的问题,后来一个一个回复看下来,让我受益匪浅,现在我在总结下我从这段代码中学到的知识。
       
    1.synchronized method(){} == synchronized(this){}
    首先要理解的是synchronized这个关键字,最关键的是它锁的是对象,而不是方法或代码段,一个线程只有拿到了这个对象的锁,才能执行这个对象的方法或代码段。这里的this指的就是调用这个方法的对象。
    2.synchronized(obj){} 注意这个obj要是共享资源,一般情况下是类成员变量,就像上面的代码中的,绝对不能定义在要同步的方法中,比如:
    public void push(Object x) {   
    	LinkedList list = new LinkedList();   
    	synchronized(list)   
        {   list.addLast( x ); 
        	System.out.println("list notify");
        	list.notify();
        	System.out.println("this notify");
            notify();   
        }   
    }

    这样是没有意义的。
     3.避免虚假唤醒,wait()方法一般放在while循环中,不要放在if中。
     4.wait()方法使得当前线程陷入等待,并且释放this的lock(release the monitor of this);notify()方法会随机唤醒在this上等待的线程,并再次获得lock(own the monitor of this)
   
    这两点很重要,也是上面代码错误的原因,上面的代码中每个方法都获得了两个锁(this和list),而pop只释放了this锁,造成push函数无法获得list锁,最终导致死循环的发生。
     要想释放list锁,必须显示调用list.wait(),而一但调用了wait方法线程就进入等待状态,无法执行下面的语句。
    
   
分享到:
评论

相关推荐

    Java同步机制浅谈

    ### Java同步机制浅谈 #### synchronized关键字的作用及应用 在Java多线程环境中,`synchronized`关键字扮演着至关重要的角色。它可以帮助开发者确保多线程环境下的数据一致性,防止因并发访问导致的数据错误。本...

    深入学习Java同步机制中的底层实现

    Java同步机制是多线程编程中确保数据一致性与正确性的关键。在Java中,主要有两种同步机制:内置的`synchronized`关键字以及基于`java.util.concurrent`包中的高级同步工具类。本文将深入探讨这些机制的底层实现,...

    同步机制(JAVA)

    3. **Java同步机制** - **synchronized关键字**:Java中的`synchronized`关键字用于实现线程同步,它可以修饰方法或代码块。当一个线程进入`synchronized`区域时,其他线程必须等待,直到该线程完成执行。 - ** ...

    java 同步机制总结java 同步机制总结

    java 同步机制总结java 同步机制总结

    java同步(一个网页)

    Java同步机制的选择取决于具体的需求和性能考虑。在处理高并发问题时,合理地使用这些同步工具能帮助我们编写出高效且安全的多线程程序。在阅读提供的"JAVA同步"网页内容时,可以深入理解这些概念并学习如何在实际...

    Java同步线程模型分析与改进

    ##### 2.2 Java同步机制的局限性 Java语言提供了一系列用于同步的机制,如`synchronized`关键字、`wait()`和`notify()`等方法。尽管这些机制在一定程度上能够满足基本的同步需求,但在实际应用中存在以下局限性: ...

    基于同步机制解决Java多线程安全问题的应用 (1).zip

    二、Java同步机制概述 Java提供了多种同步机制来防止这些问题,主要包括以下几种: 1. synchronized关键字:用于方法或代码块,确保同一时间只有一个线程可以执行特定的代码。synchronized方法或代码块确保了互斥性...

    同步代码块(synchronized).zip

    在Java编程语言中,同步代码块(synchronized blocks)是一种重要的多线程控制机制,用于保证线程安全,防止数据的不一致性。本压缩包包含了两个示例代码——Example12.java和Example13.java,它们是针对同步代码块...

    java中线程同步方法

    #### Java同步机制概述 Java为解决线程同步问题提供了丰富的工具和方法: 1. **wait方法**:此方法允许当前线程暂停执行并释放锁,直到被另一个线程唤醒。调用wait方法时,必须在`synchronized`代码块内进行,且...

    java锁机制Synchronizedjava锁机制Synchronized

    Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被看作是一个大房子,其中有多个...

    Java多线程同步机制研究分析.pdf

    Java多线程同步机制研究分析 Java多线程同步机制是Java编程语言中的一种机制,它允许多个线程同时执行,提高了系统资源的利用率和安全性。但是,多线程中最重要的问题是线程的同步和共享资源的访问保护。本文通过对...

    java+多线程+同步详解Java源码

    二、Java同步机制 1. **synchronized关键字** - `synchronized`可以修饰方法或代码块,用于控制对共享资源的访问,防止数据不一致。 - 修饰实例方法时,锁住的是对象实例。 - 修饰静态方法时,锁住的是类的Class...

    java同步

    总结,Java同步机制是保证多线程环境下数据一致性的重要手段。正确理解和运用synchronized、Lock、并发工具类等技术,可以有效地解决并发编程中的各种问题,提高程序的性能和可靠性。在实际开发中,应根据具体需求...

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

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    Java多线程同步机制的应用分析.pdf

    "Java多线程同步机制的应用分析" Java多线程同步机制的应用分析是指在Java语言中,如何使用同步机制来保护临界区,以避免多线程之间的冲突和错误。该机制通过管程机制和同步语法来保护临界区,使得多线程可以安全...

    Java多线程同步问题分析.pdf

    Java虚拟机(JVM)提供了多种机制来解决这个问题,包括 synchronized 关键字、wait() 和 notify() 方法、Lock 接口以及相关的实现如 ReentrantLock,这些机制都是Java同步机制的一部分。 1. synchronized 关键字:...

    深入探索Java中的同步机制:同步代码块与同步方法详解

    Java提供了两种主要的同步机制:同步代码块和同步方法。这两种机制都可以用来防止多个线程同时访问同一段代码,但它们的使用方式和应用场景有所不同。本文将详细探讨Java中的同步代码块和同步方法的区别,包括它们的...

    java同步网络时间

    Java同步网络时间是一个常见的任务,尤其对于需要时间精确性的应用来说非常重要。这个任务可以通过Java的NTP(Network Time Protocol)库来实现。NTP是一种互联网协议,用于在计算机之间同步时间,确保网络上的设备...

    Java同步与异步.pdf

    Java同步与异步 Java同步与异步是Java编程中非常重要的概念,它们都是为了解决多线程环境中的线程安全问题。在多线程环境中,如果没有正确的同步机制,多个线程可能会同时访问共享资源,导致数据不一致和其他严重...

    java 线程同步 信号量控制同步

    线程同步机制是 Java 编程中的一种重要机制,用于控制多个线程之间的资源访问顺序,以避免线程之间的冲突和数据不一致。开发者需要牢牢记住线程同步的四点要素,即线程同步就是线程排队,共享资源需要同步,变量需要...

Global site tag (gtag.js) - Google Analytics