锁
1)内置锁:synchronized
2)Lock 和 ReentrantLock:非公平(默认)\公平,可重入
3)读-写锁:ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock
4)条件队列:【来源】:它使得一组线程(等待线程集合)能够通过某种方式来等待特定的条件变成真。条件队列中的元素是一个个正在等待相关条件的线程。
正如每个Java对象都可以作为一个锁,每个对象同样可以作为一个条件队列,并且Object中的wait、notify和notifyAll方法就构成了内部队列的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方法和一个条件谓词。在条件谓词中包含多个状态变量,而状态变量由一个锁来保护,因此在测试条件谓词之前必须先持有这个锁。锁对象与条件队列对象(即调用wait和notify等方法所在的对象)必须是同一个对象。状态依赖方法的标准形式:
void stateDependentMethod() throw InterruptedException
{
synchronized(lock)
{
while(!conditionPredicate())
lock.wait();
}
}
5)Condition:一种广义的内置条件队列。类似Lock之于Synchronized。一个Condition和一个Lock关联在一起,就像一个条件队列和一个内置锁相关联一样。要创建一个Condition,可以再相关联的Lock上调用Lock.newCondition方法。
6)AbstractQueuedSynchronizer(AQS):许多同步类的几类,是一个构建锁和同步器的框架。许多同步器都可以通过AQS很容易并高效的构造出来:ReentrantLock、Semaphore、CountDoenLacth、ReentrantReadWriteLock、SynchronousQueue、FutureTask。
7)原子变量类
分享到:
相关推荐
读书笔记-Java并发编程实战-基础篇
java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记
java并发编程实战pdf学习笔记 总结了重要的知识点
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括可见性、发布与逸出、线程封闭、不可变性、安全发布等内容
《Java并发编程实战》个人读书笔记,非常详细: 1 简介 2 线程安全性 3 对象的共享 4 对象的组合 5 基础构建模块 6 任务执行 7 取消与关闭 8 线程池的使用 9 图形用户界面应用程序 10 避免活跃性危险 11 性能与可...
《java并发编程实战》读书笔记-第2章-线程安全性,脑图形式,使用xmind8制作 包括引言、线程安全性定义、原子性、加锁机制、使用锁保护状态、活跃性与性能等内容
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括线程安全类设计、实例封闭、线程安全性委托、现有线程安全类中添加功能和文档化同步策略等内容
Java并发编程学习笔记
《java并发编程实战》读书笔记-第3章-对象的共享,脑图形式,使用xmind8制作 包括同步容器类、并发容器类、阻塞队列和生产者消费者模式、阻塞和中断方法、同步工具类。最后是构建高效且可伸缩的结果缓存
《Java并发编程的艺术》笔记 第一章 并发编程的挑战 第二章 Java并发机制的底层实现原理 volatile的两条实现原则: 1. Lock前缀指令会引起处理器缓存回写到内存 2. 一个处理器的缓存回写到内存会导致其他...
Java语音项目的资源包括原生的JSAPI、开源库如CMU Sphinx和FreeTTS,商业化的服务如Google Cloud Speech-to-Text API,以及其他框架和工具。通过利用这些资源,您可以开发出功能强大的语音应用程序。Java语音项目的...
并发编程实战》阅读笔记 有关 Java 并发编程~ 别急别急,在重写它啦~,会补充一些新的内容进去,预计 2020/02 完成。 Content Java 并发编程基础 保证线程安全的两个角度 构造安全的并发应用程序 Java 并发高级主题 ...
Java并发编程学习笔记 本项目整理自《Java7并发编程实战手册》,感兴趣的话推荐阅读原著 本章内容包括: 线程的创建和运行 线程信息的获取和设置 线程的中断 线程中断的控制 线程的Hibernate和恢复 等待线程的终止 ...
主要介绍了Java 并发编程学习笔记之Synchronized底层优化的相关资料,主要包含了重量级锁,轻量级锁,偏向锁和其他优化等方面,有需要的小伙伴可以参考下
Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的核心理论做了下小...
Java并发编程.pdf JAVA核心知识点整理.pdf Java高级架构知识点整理.pdf Java高级架构面试知识点整理.pdf JVM与性能优化知识点整理.pdf MySQL性能调优与架构设计解析文档.pdf Nginx入门到实战.pdf springCloud笔记....
并发编程实战 自己动手写Java虚拟机,张秀宏 Spring 技术内幕:深入解析 Spring架构与设计原理(第2版) 数据库 MySQL技术内幕:Innodb 存储引擎第二版,姜承尧 Redis 设计与实现 操作系统: Linux 私
高级java笔试题 xmind-技术 Android笔记.xmind ...Java并发编程实战.xmind Java性能优化权威指南 [Java performance].xmind Java核心技术·卷1 基础知识(原书第9版).xmind Java核心技术(卷2):高
《实战Java高并发程序设计》笔记和源码笔记《实战Java高并发程序设计》中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了笔者精心制作相关笔记并整理...
java并发编程实战pdf及源码 Java虚拟机(第二版) 实战JAVA虚拟机JVM故障诊断与性能优化 HotSpot实战 Java虚拟机精讲 Kubernetes权威指南:从Docker到Kubernetes实践全接触(第2版) 鸟哥Linux私房菜 MySQL技术内幕_...