Final 可重入锁 安全发布
无状态对象(既不包含任何域,也不包含任何其他类中域的引用)一定是线程安全的。
Final
fianl域是不能修改的(但如果final域所引用的对象是可变的,那么这些被引用的对象是可变的)
除非需要可变域,否则应将其声明位final域。
初始化:
final int i = 0; //在声明时就初始常量的值(每个对象的fianl常量都为一个值)
public class Test{ //声明时未初始化,如果常量不通过构造方法或块初始化会报错
final int i;
{
i=1; //不可以再在构造函数里初始化i的值,因为块已经把常量初始化了(每个对象的fianl常量都为一个值)
}
Test(){
i=1; //通过构造方法初始化(如果有参构造器,每个对象的fianl常量可以是不同值)
}
}
public class Test{ //静态类中初始化(每个对象的fianl常量都为一个值)
static final int i;
static{
i=1;
}
}
可重入锁:为了避免死锁
当一个线程获取对象锁,需要再次获取这个对象锁:
1. 一个对象中有多个同步方法
2. 子类重写父类同步方法:
super不是指父类对象,而是一个引用,引用从父类继承来的方法。
super.父类方法,通过super引用调用从父类继承来的方法,锁对象仍然是子类对象。
public class aaa{
public static void main(String[] args) {
ccc ccc = new ccc();
ccc.dothing();
}
}
class bbb{
public void dothing(){
System.out.println("父类:"+this.toString());
}
}
class ccc extends bbb{
@Override
public void dothing() {
super.dothing();
System.out.println("super:"+super.toString());
System.out.println("子类:"+this.toString());
}
}
输出:
父类:ccc@62043840
super:ccc@62043840
子类:ccc@62043840
安全发布
不安全发布(多线程问题):
public Holder holder;
public void init() {
holder = new Holder(42);
}
由于可见性问题,其他线程看到的Holder对象可能处于不一致状态。
安全发布(保证可见性):
静态初始化器中初始化对象引用(public static Holder holder = new Holder(24);):最简单,最安全
将对象引用保存在volatile域或者AtomicReferance对象中
对象引用保存在final域中
对象引用保存在由锁保护的域中
安全发布容器:
ConcurrentMap
CopyOnWriteArrayList
BlockingQueue
可变对象:
不仅需要安全发布,并且必须是线程安全的。
解决:
线程封闭:ThreadLocal
只读共享:CopyOnWriteArrayList 和 CopyOnWriteArraySet
同步:synchronizer
保护对象:AtomicReferance
Final 可重入锁 安全发布的更多相关文章
- Java 重入锁 ReentrantLock 原理分析
1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...
- 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁
1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...
- java ReentrantLock可重入锁功能
1.可重入锁是可以中断的,如果发生了死锁,可以中断程序 //如下程序出现死锁,不去kill jvm无法解决死锁 public class Uninterruptible { public static ...
- synchronized关键字,Lock接口以及可重入锁ReentrantLock
多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...
- Java中可重入锁ReentrantLock原理剖析
本文由码农网 – 吴极心原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQue ...
- ReentrantLock(重入锁)以及公平性
ReentrantLock(重入锁)以及公平性 标签(空格分隔): java NIO 如果在绝对时间上,先对锁进行获取的请求一定被先满足,那么这个锁是公平的,反之,是不公平的,也就是说等待时间最长的线 ...
- Java多线程——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”. ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现 ...
- redis实现分布式可重入锁
利用redis可以实现分布式锁,demo如下: /** * 保存每个线程独有的token */ private static ThreadLocal<String> tokenMap = ...
- Java并发编程笔记1-竞争条件&初识原子类&可重入锁
我们知道,在多线程访问一个共享变量的时候会发生安全问题. 首先看下面例子: public class Counter { private int count; public void add(){ t ...
随机推荐
- Kaggle数据集下载
Kaggle数据集下载步骤: 安装Kaggle库: 注册Kaggle账户: 找到数据集,接受rules: 在My Account>>API中,点击Create New API Token, ...
- USB转串口CH340接线方法
https://blog.csdn.net/wangjiaweiwei/article/details/49612207 USB转串口模块可以使用5V电压供电,需要将跳帽按下图安装. USB转串口模块 ...
- java基础学习笔记四(异常)
Java中的异常 Exception 如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象. 从大体来分异常为两块: 1.error---错误 : 是指程序无法处理 ...
- 【Flutter学习】组件通信(父子、兄弟)
一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...
- Delphi 正则表达式之TPerlRegEx
官方网站: http://www.regular-expressions.info/delphi.html 直接下载: http://www.regular-expressions.info/down ...
- (转)Android OpenGL ES(一)
转:http://wiki.jikexueyuan.com/project/opengl-es-guide/pipeline.html OpenGL ES 主要用来开发 3D 图形应用的.OpenGL ...
- System.IO.Path 文件名、路径、扩展名处理
string filePath =@"E:/Randy0528/中文目录/JustTest.rar"; 更改路径字符串的扩展名.System.IO.Path.ChangeExten ...
- 优化问题及KKT条件
整理自其他优秀博文及自己理解. 目录 无约束优化 等式约束 不等式约束(KKT条件) 1.无约束优化 无约束优化问题即高数下册中的 “多元函数的极值" 部分. 驻点:所有偏导数皆为0的点: ...
- 运放参数的详细解释和分析-part1,输入偏置电流和输入失调电流【转】
一般运放的datasheet中会列出众多的运放参数,有些易于理解,我们常关注,有些可能会被忽略了.在接下来的一些主题里,将对每一个参数进行详细的说明和分析.力求在原理和对应用的影响上把运放参数阐述清楚 ...
- 使用 twine 上传自己的 python 包到 pypi
打包检查 python setup.py check 打包 python3 setup.py sdist build 上传 twine upload dist/* twine 安装: pip inst ...