`
braveCS
  • 浏览: 74276 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

笔记《Java并发编程实战》[3]

阅读更多

1)内置锁:synchronized

2Lock ReentrantLock:非公平(默认)\公平,可重入

3)读-写锁:ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock

4条件队列:【来源】:它使得一组线程(等待线程集合)能够通过某种方式来等待特定的条件变成真。条件队列中的元素是一个个正在等待相关条件的线程。 

       正如每个Java对象都可以作为一个锁,每个对象同样可以作为一个条件队列,并且Object中的waitnotifynotifyAll方法就构成了内部队列的API。对象的内置锁与其内部条件队列是相关联的。要调用对象X中条件对象的任何任何一个方法,必须持有对象X上的锁。就是因为“等待由状态构成的条件”与“维护状态一直”这两个机制必须被紧密地绑定在一起:只有能对状态进行检查时,才能在某个条件上等待,并且只有能修改状态是,才能从条件等待中释放另一个线程。

       Object.wait会自动释放锁,并请求操作系统挂起当前线程,从而使其他线程能够获得这个锁并修改对象的状态。当被挂起的线程醒来时,它将在返回之前重新获取锁。

示例代码1

public class CS
{
	public static void main(String[] args)
	{
		final CS cs=new CS();		
		new Thread(new Runnable(){
			public void run() {
				synchronized(cs) 
				{
					try {
						Thread.currentThread().sleep(1000);
					} catch (InterruptedException e1) {
						return;
					}
					cs.notify();
					for(int i=0;i<100000000;i++);
					System.out.println("after notify");
				}
			}
		}).start();		
		cs.haha();
	}
	
	public void haha()
	{
		synchronized(this) 
		{
			System.out.println(this);			
			try {
				//在其他线程调用此对象的 notify()方法或 notifyAll()方法前,导致当前线程等待,并且释放所有持有对象的lock。
				this.wait(); 
			} catch (InterruptedException e) {
				return;
			}
			System.out.println("after wait");
		}
	}
}

 

 

示例代码2

 

public class BoundedBuffer<V> extends BaseBoundedBuffer<V>
{
	//条件谓词:not-full(!isFull())
	//条件谓词:not-empty(!isEmpty())
	public BoundedBuffer(int size){ super(size);}
	
	//阻塞并直到:not-full
	public synchronized void put(V v) throws InterruptedException
	{
		while(isFull())  //循环为防止过早唤醒
			wait();
		doPut(v);
		notifyAll();   //为避免丢失信号
	}
	
	//阻塞并直到:not-empty
	public synchronized V take() throws InterruptedException
	{
		while(isEmpty())
			wait();
		V v=doTake();
		notifyAll();
		return c;
	}
}

 

在条件等待中存在一种重要的三元关系,包括加锁、wait方法和一个条件谓词。在条件谓词中包含多个状态变量,而状态变量由一个锁来保护,因此在测试条件谓词之前必须先持有这个锁。锁对象与条件队列对象(即调用waitnotify等方法所在的对象)必须是同一个对象。状态依赖方法的标准形式:

 

void stateDependentMethod() throw InterruptedException
{
	synchronized(lock)
{
	while(!conditionPredicate())
		lock.wait();
}
}

 

 

5Condition:一种广义的内置条件队列。类似Lock之于Synchronized。一个Condition和一个Lock关联在一起,就像一个条件队列和一个内置锁相关联一样。要创建一个Condition,可以再相关联的Lock上调用Lock.newCondition方法。

6AbstractQueuedSynchronizerAQS):许多同步类的几类,是一个构建锁和同步器的框架。许多同步器都可以通过AQS很容易并高效的构造出来:ReentrantLockSemaphoreCountDoenLacthReentrantReadWriteLockSynchronousQueueFutureTask

7)原子变量类

 

分享到:
评论

相关推荐

    java并发编程实践pdf笔记

    这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的区别** - **线程** 是程序执行的最小单位,一个进程中可以有多个线程同时执行,共享同一块内存空间,通信...

    读书笔记-Java并发编程实战-基础篇

    在Java并发编程中,数据的封装与访问控制、线程安全性的考量、同步机制的使用是重要的基础概念和技巧。以下是从给出的文件内容中提取出的详细知识点: 1. 数据封装与访问控制:确保内部私有数据不被轻易访问,并且...

    Java并发编程学习笔记.rar

    这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    java并发编程实践笔记

    ### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...

    《Java 并发编程实战》阅读整理笔记,附加了一些《Java 并发编程的艺术》中的内容,以及对原书结构进行了调整。.zip

    Java语音项目的资源包括原生的JSAPI、开源库如CMU Sphinx和FreeTTS,商业化的服务如Google Cloud Speech-to-Text API,以及其他框架和工具。通过利用这些资源,您可以开发出功能强大的语音应用程序。Java语音项目的...

    高级java笔试题-Java-Concurrency-in-Practice:《Java并发编程实战》阅读整理笔记,附加了一些《Java并发编

    并发编程实战》阅读笔记 有关 Java 并发编程~ 别急别急,在重写它啦~,会补充一些新的内容进去,预计 2020/02 完成。 Content Java 并发编程基础 保证线程安全的两个角度 构造安全的并发应用程序 Java 并发高级主题 ...

    Java并发实践-学习笔记

    11. **案例分析与实战**:笔记可能包含实际的并发编程案例,帮助读者更好地将理论知识应用到实践中。 通过深入学习这份"Java并发实践-学习笔记",开发者能够提升自己在处理多线程和并发问题上的能力,从而设计出更...

    java7源码-Concurryency-Learning:并发编程学习笔记

    Java并发编程学习笔记 本项目整理自《Java7并发编程实战手册》,感兴趣的话推荐阅读原著 本章内容包括: 线程的创建和运行 线程信息的获取和设置 线程的中断 线程中断的控制 线程的Hibernate和恢复 等待线程的终止 ...

    并发编程之一 日常学习笔记

    综上所述,这一系列学习笔记涵盖了并发编程的关键概念和实战技巧,包括Java内存模型、线程池、并发容器的使用以及常见数据结构的线程安全问题。通过深入学习这些内容,开发者可以更好地理解和解决多线程环境下的编程...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    JUC并发编程学习笔记(硅谷)

    Java并发编程是Java开发中的重要领域,特别是在大型分布式系统或者高并发应用中,对线程安全和性能优化的理解与实践至关重要。"JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    李兴华老师的java开发实战经典全套笔记.7z

    Java开发实战经典全套笔记是李兴华老师针对Java初学者及进阶者精心编写的教程集合,涵盖了Java语言的核心概念、重要特性和实际应用。这些笔记以PDF格式提供,易于阅读,同时也支持打印,便于离线学习和长期保存。...

    Java 并发编程学习笔记之核心理论基础

    Java并发编程是编程领域中的重要组成部分,特别是在大型系统和服务器端开发中不可或缺。Java自诞生以来就内置了对多线程的支持,使得开发者能够轻松创建并行运行的任务,提升程序性能。然而,随着并发编程实践的深入...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    狂神说JAVA的所有笔记.zip

    异常处理是JAVA中的重要安全机制,集合框架是存储和操作数据的主要工具,IO流用于文件操作和数据传输,多线程则可以实现程序的并发执行,网络编程则是开发分布式应用的基础,反射提供了运行时动态操作类和对象的能力...

    java笔记 Java-Web笔记 J2EE三大框架笔记

    多线程和IO流则涉及并发编程和数据读写,对于高性能的Web应用至关重要。 其次,Java-Web笔记进一步讲解了Servlet、JSP、过滤器、监听器等Java Web开发的核心技术。Servlet是Java Web应用的基础,用于接收和响应HTTP...

Global site tag (gtag.js) - Google Analytics