`
zy19982004
  • 浏览: 661817 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

多线程总结五:Java1.5并发Lock

 
阅读更多

一.概述

  1. java1.5为我们提供了同步控制的新途径, java.util.concurrent.locks.*提供了两个核心接口:Lock,Condition。
  2. Lock接口提供了比synchronized关键字同步流程更加清晰的方法。
  3. Condition接口替代了object对象的三个监视方法。

二.代码

  1. 传统synchronized + wait + notify控制同步。
    package com.zzy.syn;
    
    /**
     * 传统同步方式
     * synchronized + wait + notify
     * @author eason
     *
     */
    public class TestSynchronized {
    
    	public static void main(String[] args) {
    		final Service service = new Service();
    		
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				service.subThread();          //新线程调用subThread方法
    				
    			}
    		}).start();
    		
    		service.mainThread();                //主线程调用mainThread方法
    	}
    	
    	static class Service {
    		
    		private boolean shouldSubRun = true;   //此时是否该执行subThread方法
    		
    		public synchronized void mainThread() {
    			while(shouldSubRun) {       
    				try {
    					wait();         //该执行subThread方法,调用mainThread方法的主线程等待
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    			
    			System.out.println("mainThread method execute");  //逻辑区域
    			shouldSubRun = true;        //mainThread方法执行完后,该执行subThread方法
    			notify();                   //唤醒等待在subThread方法上的的新线程
    		}
    
    		public synchronized void subThread() {
    			while(!shouldSubRun) {      
    				try { 
    					wait();           //该执行mainThread方法,调用subThread方法的新线程等待
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    				
    			System.out.println("subThread method execute");  //逻辑区域
    			shouldSubRun = false;     //subThread方法执行完后,该执行mainThread方法
    			notify();                 //唤醒等待在mainThread方法上的的主线程
    		}
    	}
    		
    }
     
  2. Lock+Condition控制同步。
    package com.zzy.syn;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * java1.5提供的同步方式
     * lock + condition
     * @author eason
     *
     */
    public class TestLock {
    
    	public static void main(String[] args) {
    		final Service service = new Service();
    		
    		//线程sub1调用service的sub1方法
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				service.sub1();
    				
    			}
    		}, "sub1").start();
    		//线程sub2调用service的sub2方法
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				service.sub2();
    				
    			}
    		}, "sub2").start();
    		//线程sub3调用service的sub31方法
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				service.sub3();
    				
    			}
    		}, "sub3").start();
    		
    	}
    	
    	static class Service {
    		
    		private int shouldSubNum = 1;                  //此时该sub几方法执行
    		private Lock lock = new ReentrantLock();
    		Condition sub1 = lock.newCondition();
    		Condition sub2 = lock.newCondition();
    		Condition sub3 = lock.newCondition();
    		
    		public void sub1() {
    			lock.lock();
    			try{
    				while(shouldSubNum != 1) {       
    					try {
    						sub1.await(); //该sub2或sub3方法执行时,调用sub1方法的sub1线程等待
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    				
    				System.out.println("sub1 method execute");
    				shouldSubNum = 3;                     //sub1方法线程完后,轮到sub3执行
    				sub3.signal();                        //唤醒调用sub3方法的sub3线程
    			} finally {
    				lock.unlock();
    			}
    		}
    		
    		public void sub2() {
    			lock.lock();
    			try{
    				while(shouldSubNum != 2) {       
    					try {
    						sub2.await(); //该sub1或sub3方法执行时,调用sub2方法的sub2线程等待
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    				
    				System.out.println("sub2 method execute");
    				shouldSubNum = 1;                    //sub2方法线程完后,轮到sub1执行
    				sub1.signal();                       //唤醒调用sub1方法的sub1线程
    			} finally {
    				lock.unlock();
    			}
    		}
    		
    		public void sub3() {
    			lock.lock();
    			try{
    				while(shouldSubNum != 3) {       
    					try {
    						sub3.await(); //该sub1或sub2方法执行时,调用sub3方法的sub3线程等待
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    				
    				System.out.println("sub3 method execute");
    				shouldSubNum = 2;                    //sub3方法线程完后,轮到sub2执行
    				sub2.signal();                       //唤醒调用sub2方法的sub2线程
    			} finally {
    				lock.unlock();
    			}
    		}
    
    	}
    		
    }
     

三.二者对比

  1. Lock接口提供了比synchronized更加广泛和灵活的操作。
    1. Lock接口的实现允许锁在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁。上例一个反应出来了。
    2. 其他的用到在写。
  2. synchronized是在JVM 层面上实现的,Lock是在代码层面实现的。
  3. synchronized在锁定时如果方法块抛出异常,JVM 会自动将锁释放掉,不会因为出了异常没有释放锁造成线程死锁。但是 Lock 的话就享受不到 JVM 带来自动的功能,出现异常时必须在 finally 将锁释放掉,否则将会引起死锁。
分享到:
评论

相关推荐

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    Java 模拟线程并发

    最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...

    深入学习:Java多线程编程

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

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    Tesseract OCR多线程并发识别案例

    4. **并发控制**:为了避免多线程间的竞态条件和资源冲突,可能需要使用锁或其他同步机制,如`threading.Lock`。例如,在写入识别结果到文件或数据库时,需要确保同一时刻只有一个线程在操作。 5. **错误处理**:多...

    高并发多线程处理demo-java.rar

    在Java编程领域,高并发和多线程是关键的技术之一,尤其在服务器端应用和大数据处理中至关重要。这个"高并发多线程处理demo-java.rar"压缩包提供了一个实际的Java实现,展示了如何构建一个并发队列来接收数据,并...

    多线程,高并发.zip

    另外,Java并发API(java.util.concurrent包)提供了一系列高级并发工具,如`ConcurrentHashMap`(线程安全的哈希映射)、`BlockingQueue`(阻塞队列)和`Future`(异步计算结果)。这些工具可以帮助开发者更好地...

    Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。

    ### Java中的两种多线程实现方式 在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`...

    java并发编程与实践

    在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...

    java多线程与并发1

    1. 同步机制:避免多线程环境下数据不一致,Java提供了synchronized关键字、volatile变量、Lock接口(如ReentrantLock)等同步工具。 2. 死锁:多个线程互相等待对方释放资源导致的僵局,需要避免和处理死锁。 3. ...

    java多线程处理数据库数据

    通过以上方法,我们可以在Java中有效地利用多线程处理数据库数据,提高程序的并发能力和效率。记得在设计时充分考虑线程间的协作与同步,以及数据库连接的管理和优化,以确保程序的稳定性和性能。

    Java+并发性和多线程

    Java并发性和多线程是Java开发中至关重要的概念,它们涉及到如何在单个或多个处理器上同时执行程序的不同部分,从而提升程序的效率和响应速度。在这个领域,Java提供了丰富的工具和API,使得开发者能够有效地管理和...

    Java并发编程实践(java concurrency in practice)pdf (java多线程总结.ppt)

    配合`JAVA多线程总结.ppt`,你可以得到一个更直观和简洁的概览,快速回顾和掌握上述关键知识点。虽然中文版翻译可能存在不足,但原版英文书籍通常能更准确地传达作者的意图和细节,值得深入阅读。

    java多线程Demo

    在多线程环境下,可能会出现数据竞争问题,为了解决这个问题,Java提供了多种同步机制,如synchronized关键字、wait/notify机制、Lock锁(ReentrantLock)等。synchronized用于控制对共享资源的访问,而wait/notify...

    JAVA-多线程 所有文件

    13. **并发集合**:Java并发库提供了一些线程安全的集合,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `ConcurrentLinkedQueue`等,它们在多线程环境下表现更优。 在实际项目中,理解和熟练运用这些多线程知识...

    java多线程设计

    总结,Java多线程设计是构建高性能、高并发应用的基础。通过理解并合理使用不可变对象,我们可以有效预防多线程环境中的非安全问题,确保程序的稳定性和正确性。在实际开发中,结合各种线程同步机制和并发工具,可以...

    JAVA单线程多线程

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

    java多线程文件传输

    在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨相关知识点。 1. **线程基础** - **线程定义**:线程是操作系统分配CPU时间的基本单位,是程序执行的...

    超实用的Java并发多线程教程

    Java并发多线程是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类、`Runnable`接口以及`ExecutorService`来实现。下面我们将深入探讨...

Global site tag (gtag.js) - Google Analytics