无状态对象(既不包含任何域,也不包含任何其他类中域的引用)一定是线程安全的。

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 可重入锁 安全发布的更多相关文章

  1. Java 重入锁 ReentrantLock 原理分析

    1.简介 可重入锁ReentrantLock自 JDK 1.5 被引入,功能上与synchronized关键字类似.所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生 ...

  2. 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁

    1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...

  3. java ReentrantLock可重入锁功能

    1.可重入锁是可以中断的,如果发生了死锁,可以中断程序 //如下程序出现死锁,不去kill jvm无法解决死锁 public class Uninterruptible { public static ...

  4. synchronized关键字,Lock接口以及可重入锁ReentrantLock

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

  5. Java中可重入锁ReentrantLock原理剖析

    本文由码农网 – 吴极心原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQue ...

  6. ReentrantLock(重入锁)以及公平性

    ReentrantLock(重入锁)以及公平性 标签(空格分隔): java NIO 如果在绝对时间上,先对锁进行获取的请求一定被先满足,那么这个锁是公平的,反之,是不公平的,也就是说等待时间最长的线 ...

  7. Java多线程——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”. ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现 ...

  8. redis实现分布式可重入锁

    利用redis可以实现分布式锁,demo如下: /** * 保存每个线程独有的token */ private static ThreadLocal<String> tokenMap = ...

  9. Java并发编程笔记1-竞争条件&初识原子类&可重入锁

    我们知道,在多线程访问一个共享变量的时候会发生安全问题. 首先看下面例子: public class Counter { private int count; public void add(){ t ...

随机推荐

  1. ECUST_Algorithm_2019_4

    简要题意及解析 1001 第三次作业原题,略. 1002 把一个数转换为二进制. 不断除以\(2\)取余就好了.写递归代码会非常短. 时间复杂度\(O(Tlogn)\) \(T\)是数据组数,\(n\ ...

  2. 21.与重入锁相关联的Condition

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * ...

  3. 为何使用Html5+CSS3

    一:大多浏览器支持,低版本也没问题 我看点这方面的资料,是为了做手机应用网站(有三个方案,这个是备用方案),可以开发响应式网站,可以脱离开发平台进行跨平台. 在Html5网页中引入Modernizr, ...

  4. Django基础篇(一)

    Python的Web框架有Django.Tornado.Flask等多种,Django相较其他web框架的优势有: 大而全.框架本身集成了ORM框架.模板绑定.缓存.Session等诸多功能. 1.安 ...

  5. SQLSERVER 时间日期函数,查询今天日期、昨天、一个星期、半年前的数据

    今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0昨天的所有数据:select * from 表名 where D ...

  6. VEX IR语言语法

    /*---------------------------------------------------------------*//*--- High-level IR description - ...

  7. 嵌入式C语言4.4 C语言内存空间的使用-多级指针

    多级指针 int **p; 存访地址的地址空间

  8. vue轮播,展示pdf

    vue轮播,展示pdf 根据左侧图片格式,右侧展示相应的pdf文件与图片.(vue中不支持pdf格式,pdf文件要放在static文件里):代码如下: <template> <!-- ...

  9. PAT甲级——A1146 TopologicalOrder【25】

    This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topol ...

  10. Django框架(二十二)—— Django rest_framework-频率组件

    目录 频率组件 一.作用 二.自定义频率类 三.内置的访问频率控制类 四.全局.局部使用 1.全局使用 2.局部使用 3.局部禁用 五.源码分析 1.as_view -----> view -- ...