`

Java中的多线程学习二:线程的同步

阅读更多
---摘自高人
因为多线程,所以我们需要对线程进行一些调度,也就是对线程进行一些处理,防止多线程带来的不同步问题。



在Java中,大的说有两种机制去实现多线程的同步,但是本质上来讲,是一种机制,那就是锁。



首先,是Java中的 java.util.concurrent.locks 中的锁。



这个包中有一个接口 Lock, 有一个类 ReentrantLock 实现了 Lock。



该方法中有一个lock方法,也就是获取锁,一旦某一个线程执行到这个方法,该线程就获得了锁。



如果别的线程如果执行到该方法,而锁已经被另一个线程获取了,则该线程被阻塞,直到获得锁的线程执行到 unlock 方法。



也就是说,如果获得锁的线程没有知道 unlock 方法,则别的线程永远不能运行 lock 和 unlock 之间的代码。



为了保证unlock方法用于被执行,一般都采用如下的格式开发:

Java代码 
1.Lock l= new ReentrantLock();  
2. 
3.l.lock();  
4. 
5.try{  
6.     //需同步的代码  
7.}  
8.finally{  
9.    l.unlock();  
10.} 
Lock l= new ReentrantLock();

l.lock();

try{
     //需同步的代码
}
finally{
    l.unlock();
} 这样,就保证了线程的同步。



还有这样一种情况,当同步的代码需要某个条件时,线程才能继续执行。



那就很有可能某一线程获得锁,但是没有条件满足该线程继续运行,那么该线程就白白的浪费了这把锁。



所以,就有一个条件对象来解决这一问题。看下面的代码

Java代码 
1.Lock l= new ReentrantLock();  
2.Condition cd = l.newCondition();  //生成该锁的条件对象  
3. 
4.l.lock();  
5. 
6.try{  
7.      while( 条件不满足 )  
8.        cd.await();    // 使得线程释放该锁,并进入该锁的等待池  
9. 
10.     //需同步的代码  
11. 
12.        cd.signalAll();   //唤醒该锁等待池中的所有线程  
13.}  
14.finally{  
15.    l.unlock();  
16.} 
Lock l= new ReentrantLock();
Condition cd = l.newCondition();  //生成该锁的条件对象

l.lock();

try{
      while( 条件不满足 )
        cd.await();    // 使得线程释放该锁,并进入该锁的等待池

     //需同步的代码

        cd.signalAll();   //唤醒该锁等待池中的所有线程
}
finally{
    l.unlock();
}这样,就实现了对线程的细节控制,使得我们可以精准的控制同步。



除了这个方法,Java中还有另外一种方法,也就是 synchronized 语法。本质上和上面所讲的lock是一样的。



下面同样看一段代码:

Java代码 
1.synchronized ( obj ) {  
2.     //需同步的代码  
3.} 
synchronized ( obj ) {
     //需同步的代码
}

虽然代码简单,但是和第一段代码的效果是一样的。



为了实现条件对象类似的效果,可以使用Object中的wait 和 notify 方法,如下代码:

Java代码 
1.synchronized ( obj ){  
2.      while( 条件不满足 )  
3.        wait();  
4. 
5.     //需同步的代码  
6. 
7.       notifyAll();  
8.} 
synchronized ( obj ){
      while( 条件不满足 )
        wait();

     //需同步的代码

       notifyAll();
}

效果也同第二段代码一样,所以才说,这两种方法本质上是同一种方法。
分享到:
评论

相关推荐

    Java_多线程编程线程:大总结

    ### Java多线程编程大总结 #### 一、Java多线程编程的演进与重要性 Java多线程编程自Java 5之后经历了显著的革新与扩展,引入了强大的并发包,极大地增强了多线程编程的能力。在Java 5之前,多线程的支持较为薄弱...

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    Java多线程编程总结

    Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    java多线程学习资料

    ### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    Java多线程同步.pdf

    Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用synchronized关键字还不能...

    java多线程学习

    在学习Java多线程的过程中,理解线程与进程的概念是非常基础且重要的一步。首先,进程是一个程序的执行实例,是操作系统资源分配的基本单位,具有独立的地址空间和运行状态。每个进程至少包含一个线程,我们称之为...

    javad多线程

    Java 中的多线程编程需要解决线程同步问题,以避免线程之间的冲突。Java 提供了两种方法来解决线程同步问题: 1. synchronized 关键字:synchronized 关键字可以用来声明 synchronized 方法或块,以控制对共享资源...

    java+多线程+同步详解源代码学习

    Java多线程与同步是Java编程中的核心概念,它们在构建高效、响应迅速的应用程序时起着至关重要的作用。在大型系统开发中,多线程技术使得程序能够同时执行多个任务,提高系统的并发性,而同步机制则确保了在多线程...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    java多线程进度条

    总之,实现Java多线程进度条涉及线程同步、共享数据更新以及UI更新的协调。理解这些核心概念,并根据具体需求选择合适的方法,是构建高效、用户友好进度条的关键。在ProgressTest这个示例项目中,你可能会找到更多...

    JAVA-多线程 所有文件

    这个“JAVA-多线程 所有文件”压缩包很可能包含了一系列关于Java多线程学习的源代码示例和相关文档。下面我们将深入探讨Java多线程的相关知识点。 1. **线程的概念**:线程是操作系统分配CPU时间的基本单位,一个...

    JAVA多线程学习内容

    总的来说,Java多线程学习涵盖了线程的创建、同步、通信、调度以及异常处理等多个方面,深入理解和掌握这些知识点对于提升Java程序的性能和复杂性至关重要。通过阅读提供的"Java多线程.pdf"文档,你可以进一步了解和...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

Global site tag (gtag.js) - Google Analytics