Java 线程同步总结

一、synchronized

(1)synchronized方法

(2)synchronized块

 

二、Lock

注意:及时释放Lock锁,否则会出现死锁,通常在finally代码释放锁 

(1)ReentrantLock          

实现Lock接口,提供lock(),tryLock()和unLock()方法。

lock()          获取锁

tryLock()     尝试获取锁,返回true/false

unlock()      释放获得的锁

 

(2)ReentrantReadWriteLock

实现ReadWriteLock接口,并非Lock接口。

readLock()方法获取可读锁对象是Lock的实例,可读锁对象是共享锁

writeLock()方法获取可写锁Lock对象是Lock的实例,可写锁对象是排他锁

 

三、volatile关键字

volatile关键字为域变量的访问提供了一种免锁机制, 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新, 因此每次使用该域就要重新计算,而不是使用寄存器中的值。

volatile只能保证代码的可见性,而不能保证代码的原子性。

volatile不会提供任何原子操作,它也不能用来修饰final类型的变量 。

 

volatile关键字具备了两层语义:

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

2)禁止进行指令重排序。

 

使用场景:

1)对变量的写操作不依赖于当前值,如i++

2)该变量没有包含在具有其他变量的不变式中,如low<up

 

四、ThreadLocal类

ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

ThreadLocal 类的常用方法

    get()                      返回此线程局部变量的当前线程副本中的值 
    initialValue()          返回此线程局部变量的当前线程的初始值"
    set(T value)          将此线程局部变量的当前线程副本中的值设置为value

 

五、使用阻塞队列实现线程同步

BlockingQueue接口和BlockingDeque,使用ReentrantLock

ArrayBlockingQueue

LinkedBlockingQueue

LinkedBlockingDeque

SynchronousQueue

阻塞方法put、take

非阻塞方法offer与poll、add与remove

 

六、原子变量实现线程同步

 java.util.concurrent.atomic包

(1)使用volatile和CAS算法

AtomicBoolean

AtomicInteger

AtomicIntegerArray

AtomicLong

AtomicLongArray

AtomicReference

AtomicReferenceArray

AtomicStampedReference

 (2)使用Striped64和Cell(volatile和CAS)

LongAccumulator

LongAdder

DoubleAccumulator

DoubleAdder

 

七、wait与notify()/notifyAll()

 Object类的成员方法,在同步代码区使用

wait         阻塞线程

notify       唤醒阻塞线程

notifyAll   唤醒所有阻塞线程

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aws es方案_AWS Elasticsearch后模式

aws es方案碰巧我们在SaaS版本的LogSentinel上遇到了生产问题–我们的Elasticsearch停止了对新数据编制索引。 由于Elasticsearch只是辅助存储&#xff0c;因此没有数据丢失&#xff0c;但这给我们的客户带来了一些问题&#xff08;他们无法在其仪表板上看到实时数据&#xff0…

java注解总结

【0】README 0.1&#xff09;本文主要对 java 注解做总结&#xff1b; 【1】处理注解的级别 level1&#xff09; 在运行期级别处理注解&#xff1a; http://blog.csdn.net/pacosonswjtu/article/details/50719361level2&#xff09;在源码级别处理注解&#xff1a; http://b…

Java 类加载总结

一、类加载过程 装载链接验证准备解析初始化二、类初始化情况 1&#xff09;创建类的实例&#xff0c;也就是new一个对象 2&#xff09;访问某个类或接口的静态变量&#xff0c;或者对该静态变量赋值 3&#xff09;调用类的静态方法 4&#xff09;反射&#xff08;Class.…

maven依赖管理_依赖管理和Maven

maven依赖管理Maven伟大而成熟。 几乎所有事物都总有解决方案。 您可能在组织项目上遇到的主要情况是依赖管理。 而不是每个项目都具有自己的依赖关系&#xff0c;您需要一种集中的方式来继承那些依赖关系。 在这种情况下&#xff0c;您可以在父舞会上声明托管依赖项。 在我的…

JavaBean 持久化

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 JavaBean 持久化 的基础知识&#xff1b; 0.2&#xff09;本文所有源代码荔枝均为原创&#xff1b; 0.3&#xff09; for complete souce code, please visit https://github.com/pa…

apache kafka_Apache Kafka消费者再平衡

apache kafka消费者重新平衡决定哪个消费者负责某个主题的所有可用分区的哪个子集。 例如&#xff0c;您可能有一个包含20个分区和10个使用者的主题。 在重新平衡结束时&#xff0c;您可能希望每个使用者都从2个分区中读取数据。 如果关闭了这些使用者中的10个&#xff0c;则可…

Java 注解总结

一、注解定义 注解早在J2SE1.5就被引入到Java中&#xff0c;主要提供一种机制&#xff0c;这种机制允许程序员在编写代码的同时可以直接编写元数据。 二、元注解 Target 说明了被修饰的注解的应用范围&#xff0c;也就是被修饰的注解可以用来注解哪些程序元…

编译原理三大经典书籍(龙书 虎书 鲸书)

以下内容转自&#xff1a; http://blog.csdn.net/skymingst/article/details/7436892 1、龙书&#xff08;Dragon book&#xff09; 英文名&#xff1a;Compilers: Principles,Techniques,and Tools 作者&#xff1a;Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman 中文名&…

两个时间之间是多少小时_那是两个小时我不会回来

两个时间之间是多少小时正如我之前关于linting主题所说的 &#xff0c;花时间修改代码的好处很有限&#xff0c;因为自动工具告诉您这样做。 更糟糕的是&#xff0c;这些工具并非万无一失。 例如&#xff0c;我们一直在针对完美无害的try-with-resources构造周围的SpotBugs警告…

java的类载入器

【0】README 0.1&#xff09;本文文字转自&#xff1a; 深入剖析tomcat&#xff0c; 旨在 理解 jvm 的类载入器&#xff1b; 【1】 jvm的类载入器相关 1&#xff09;jvm 使用了3种类载入器来载入所需要的类&#xff1a;分别是引导类载入器&#xff08;bootstrap class load…

Java 代理总结

一、代理 为其他对象提供一种代理以便控制对这个对象的访问。 &#xff08;1&#xff09;静态代理 &#xff08;2&#xff09;动态代理 1&#xff09;JDK自带的动态代理 2&#xff09;javaassist字节码操作库实现 3&#xff09;CGLIB 4&#xff09; ASM&#xff08;底层…

分解因数 递归_递归分解WAR文件

分解因数 递归抽象 是否曾经需要分解WAR文件以及分解WAR文件中的所有JAR文件&#xff1f; 是的&#xff0c;我也是&#xff01; 我写了ferris-war-exploder来爆炸&#xff1a; 一个JAR文件 一个WAR文件&#xff0c;它找到的每个JAR文件也会爆炸。 包含每个JAR文件&#xff…

jvm(2)-java内存区域

【0】README 0.1&#xff09;本文转自 深入理解jvm&#xff0c; 旨在学习 java内存区域 的基础知识&#xff1b; 【1】运行时数据区域 1&#xff09;jvm 所管理的内存将会包括以下几个运行时数据区域 1.1&#xff09;方法区&#xff1b;&#xff08;线程共享&#xff09; 1.2&…

Java Socket编程总结

一、网络API InetAddress     用于标识网络上的硬件资源&#xff0c;主要是IP地址 URL         统一资源定位符&#xff0c;通过URL可以直接读取或写入网络上的数据Sockets      使用TCP协议实现的网络通信Socket相关的类Datagram     使用UDP协议&am…

java插入排序_Java程序要插入排序

java插入排序Java程序插入示例的排序。 显示了示例仿真以及时间复杂度。 插入排序是一种简单的排序算法&#xff0c;可以一次构建一个最终的排序数组&#xff08;或列表&#xff09;。 它比冒泡排序有效得多&#xff0c;并且在大型列表上的效率比快速排序 &#xff0c;堆排序或…

jvm(2)-JVM内存的设置(解决eclipse下out of memory问题)

【0】README 0.1&#xff09;本文转自&#xff1a; http://blog.csdn.net/sjf0115/article/details/8889201 一、JVM内存的设置的原理 默认的java虚拟机的大小比较小&#xff0c;在对大数据进行处理时java就会报错&#xff1a;java.lang.OutOfMemoryError。 设置jvm内存的方…

Java Servlet总结

一、Servlet简介 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用Java编写的服务器端程序&#xff0c;主要功能在于交互式地浏览和修改数据&#xff0c;生成动态Web内容。狭义的Servlet是指Java语言实…

java oca_OCA第1部分中的Java难题

java oca我在业余时间正在阅读Mala Gupta的Oracle认证Java SE程序员助理书&#xff0c;我对所学到的一些新知识感到惊讶。 有时候他们真的没有道理&#xff0c;有时候他们说得通&#xff0c;但真的让人惊讶。 因此&#xff0c;在本系列文章中&#xff0c;我想将它们共享为“ Ja…

jvm(1)-走进java

【0】README0.1&#xff09;本文转自 深入理解 jvm&#xff0c;旨在了解 java 体系结构&#xff1b;【1】java技术体系1&#xff09; Sun 官方所定义的java 技术系统包括以下几个组成部分&#xff1a; java 程序设计语言&#xff1b;各种硬件平台上的java 虚拟机&#xff1b;Cl…

Java 高并发下的实践

一、使用的技术HashMap ConcurrentHashMap Lock ReadWriteLock synchronized 二、一百万并发下的组合 ConcurrentLockMap /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* …