`
huangyongxing310
  • 浏览: 490258 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

java ReentrantLock应用

    博客分类:
  • Java
阅读更多
java ReentrantLock应用

ReentrantLock可重入锁

1.使用ReentrantLock接口要比使用synchronized关键字效率高一些


不公平锁与公平锁的区别:
private ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁
private ReentrantLock lock = new ReentrantLock(true); //公平锁

1.公平情况下,操作会排一个队按顺序执行,来保证执行顺序。(会消耗更多的时间来排队)
2.不公平情况下,是无序状态允许插队,jvm会自动计算如何处理更快速来调度插队。(如果不关心顺序,这个速度会更快)


例子:
import java.util.concurrent.locks.ReentrantLock;

public class addI extends Thread {
	private static int i = 0;
	private static ReentrantLock reentrantLock = new ReentrantLock();
	private int threadId = 0;

	@Override
	public void run() {
		//等待一个一个
        try {
        	reentrantLock.lock();
        	i++;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 解锁
        	reentrantLock.unlock();
        }

      //如果已加锁,则不再重复加锁
//        if (reentrantLock.tryLock()) { //如果得不到锁就直接不执行
//        	 try {
//             	i++;
//             } catch (Exception e) {
//                 e.printStackTrace();
//             } finally {
//                 // 解锁
//             	reentrantLock.unlock();
//             }
//        }

      //如果发现该操作已经在执行,则尝试等待一段时间,等待超时则不执行(尝试等待执行)(实际应用会比较多用这种方式)
//        try {
//        	//如果已经被lock,尝试等待5s,看是否可以获得锁,如果5s后仍然无法获得锁则返回false继续执行
//        	if (reentrantLock.tryLock(5, TimeUnit.SECONDS)) {
//        		 try {
//        			 i++;
//        		 }catch (Exception e) {
//        	            e.printStackTrace();
//        	        } finally {
//        	            // 解锁
//        	        	reentrantLock.unlock();
//        	        }
//        	 }
//
//        } catch (InterruptedException e) {
//        	   e.printStackTrace(); //当前线程被中断时(interrupt),会抛InterruptedException
//        }

        //可中断锁
//        try {
//        	reentrantLock.lockInterruptibly(); //可以用线程的.interrupt()接口打断
//            //操作
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        } finally {
//        	reentrantLock.unlock();
//        }

		System.out.println("threadId = " + threadId + " i= " + i);
	}

	public addI(int threadId) {
		super();
		this.threadId = threadId;
	}
}


public class ReentrantLockTest {
	public static void main(String[] args) {
		Thread thread[] = new Thread[10];
		for (int i = 0; i < 10; i++) {
			thread[i] = new addI(i);
		}
		for (int i = 0; i < 10; i++) {
			thread[i].start();
		}
	}
}




参考原文:http://blog.csdn.net/woaieillen/article/details/8046876
参考原文:http://www.cnblogs.com/xiaorenwu702/p/3975916.html
参考原文:https://my.oschina.net/andylucc/blog/651982
分享到:
评论

相关推荐

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    在Java多线程编程中,ReentrantLock提供了更灵活的锁管理机制,相比synchronized,它允许更细粒度的控制,并且提供了更多的同步原语。以下是一些使用ReentrantLock的关键点: 1. **可重入性**:ReentrantLock允许一...

    ReentrantLock源码的使用问题详解.docx

    《ReentrantLock源码详解与应用》 ReentrantLock,可重入锁,是Java并发编程中一个重要的锁实现,它提供了比synchronized更高级别的控制能力,包括公平性和非公平性选择。本文将深入探讨ReentrantLock的原理,特别...

    java帮助和web应用

    标题“Java帮助和Web应用”表明这份文档是关于Java语言的帮助指南,并且特别强调了其在Web应用程序开发方面的应用。这暗示着文档内容不仅会涵盖Java基础知识,还会涉及如何使用Java进行Web开发的相关技术。 #### ...

    java多线程的应用事例

    Java提供了多种工具来解决这些问题,如synchronized、volatile、ReentrantLock等。 线程的优先级也是重要概念,Java中的Thread类定义了线程优先级,但实际调度仍然取决于操作系统。优先级高的线程通常有更高的执行...

    Java高级应用.zip

    Java作为一门广泛使用的编程语言,其高级应用涵盖了多个领域,包括多线程、网络编程、反射、内存管理、集合框架的深入理解、JVM优化、并发编程、设计模式等。以下将详细介绍这些Java高级应用的知识点。 1. **多线程...

    Java高级应用编程大作业.zip

    在Java高级应用编程大作业中,我们可以探索一系列深入的Java技术,这些都是大学生在学习Java时可能会遇到的关键概念和实践。这个压缩包包含了“zgl_resource”文件,这可能是一个资源文件夹,通常用于存放课程作业和...

    构建高性能的大型分布式java应用

    在构建高性能的大型分布式Java应用时,我们面临的是复杂的技术挑战和优化目标。要实现这样的系统,我们需要深入了解Java平台的特点,以及如何利用其优势来处理大规模数据和高并发请求。以下是一些关键的知识点: 1....

    java中线程的应用例子

    2. **线程同步**:为了防止数据竞争,Java提供了多种同步机制,如`synchronized`、`volatile`、`ReentrantLock`等。 3. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,但它们必须在`...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    总结来说,Java中的并发加锁机制非常灵活且强大,通过对`ReentrantLock`和`ReentrantReadWriteLock`等工具的理解和应用,可以有效地解决多线程环境下的并发控制问题。希望本文能帮助读者更好地理解和掌握Java并发...

    分布式JAVA应用+基础与实践(完整版)

    4. **Java并发编程**:在分布式环境中,线程安全和并发控制尤为重要,Java并发API如synchronized、ReentrantLock、ConcurrentHashMap等是实现的关键。 5. **分布式缓存**:如Redis、Memcached,用于缓解数据库压力...

    安全的编写多线程的_Java_应用程序

    ### 安全编写多线程Java应用程序的关键知识点 #### 一、引言 在现代软件开发中,多线程编程已成为提升程序性能和响应性的关键手段之一。Java作为一种广泛使用的编程语言,提供了丰富的多线程支持。然而,多线程...

    ReentrantLock 实现原理 1

    ReentrantLock 是 Java 中的一个同步工具类,它实现了 Lock 接口,提供了锁的获取和释放机制。ReentrantLock 的实现原理基于 AQS(AbstractQueuedSynchronizer),是一个重入锁,允许一个线程反复地获取锁而不会出现...

    JAVA 线程类应用

    Java线程类应用是Java编程中的重要组成部分,它关乎到多任务处理和程序并发执行的能力。在Java中,线程是程序执行的最小单位,它允许一个程序中有多个执行流同时进行,使得程序能更高效地利用系统资源,特别是在处理...

    提升你的Java应用性能改善数据处理Java开发Java经

    在Java开发过程中,优化应用程序性能和高效处理数据是至关重要的任务。这关乎到软件的响应速度、资源利用效率以及整体用户体验。"提升你的Java应用性能改善数据处理Java开发Java经验技巧"这一主题涵盖了许多关键的...

    Java实训 Java高级应用编程 第4章 多线程编程(共29页).ppt

    Java多线程编程是Java高级应用的重要组成部分,它允许程序同时执行多个任务,提升软件的效率和响应性。本章内容涵盖了多线程的核心概念、实现方式、线程的属性和控制,以及线程同步与通信的问题。 首先,我们要了解...

    java 基础到高级应用

    ### Java基础到高级应用知识点概览 #### 一、Java基础知识 - **Java语言特性**: - 面向对象:封装、继承、多态。 - 平台无关性:通过Java虚拟机(JVM)实现了跨平台运行的能力。 - 自动垃圾回收:减少了内存...

    ReentrantLock 与 synchronized 简介

    `ReentrantLock`是`java.util.concurrent.locks`包下的一个接口实现,提供了比`synchronized`更灵活的锁操作方式。 1. **基本概念**: - `ReentrantLock`实现了`Lock`接口,提供了类似`synchronized`的关键字的...

    Java多线程应用

    - Java提供多种同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法以及`ReentrantLock`等,防止数据竞争和线程安全问题。 - 同步方法或同步块确保同一时间只有一个线程可以访问共享资源...

Global site tag (gtag.js) - Google Analytics