Java线程安全初步了解。JAVA线程安全从总体上来说,是指Java对象在多线程运行环境下的一种特性,表现为常规(区别于特殊调用情况)情况下每次调用都能得到正确的逻辑结果。从本质上来说,将对象的方法行为加上了同步控制逻辑,而调用者无须做其他额外的同步控制就可以安全放心的使用对象。
1.线程安全的定义
当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。这个定义很严谨,它要求就线程安全的代码都具备一个特征:代码本身封装了所有必要的正确性保障手段,令调用者无须关心多线程的问题,更无须自己实现热河措施来保证多线程的正确调用。
2.Java语言中的线程安全
为了更深入地理解线程安全,按照线程安全的“安全强度”由强至弱来排序:不可变,绝对线程安全,相对线程安全,线程兼容和线程对立。
2.1 不可变
在jDK1.5以后不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再进行任何的线程安全保障措施,通过final关键字修饰的属性,对象或方法,那其外部的可见状态永远也不会改变。如果共享数据是一个基本数据类型,那么只要在定义时使用final关键字修饰就可以保证它是不可变得。如String类对象,就是一个典型的不可变对象,我们调用substring(),replace(),和concat()这些方法都不会影响它原来的值,只会返回一个新构造的字符串对象。
2.2相对线程安全
相对线程安全就是我们通常意义上所讲的线程安全,它需要保证这个对象单独的操作是线程安全的。在java中大部分线程安全类都属于这种类型,如Vector,HashTable等。
2.3线程兼容
线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中安全地使用。
2.3线程对立
线程对立是指不管调用端是否采用了同步措施,都无法在多线程环境中并发使用的代码。由于Java语言天生就具备多线程特性,线程对立这种排斥多线程的代码很少出现。常见的线程对立操作有Thread类的suspend()和resume()方法,System.setIn()等。
3.线程安全的实现方法
3.1互斥同步
互斥同步是最常见的一种并发正确性保障手段,同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一条线程使用。而互斥是实现同步的一种手段,临界区,互斥量和信号量都是主要的互斥实现方式。互斥是因,同步是果,互斥是方法,同步是目的。
在Java中,最基本的互斥同步手段就是synchronized关键字。除此之外还可以使用java.util.concurrent包中的重入锁(ReentrantLock)来实现同步。在用法上都很相似,只是代码写法上有点区别,一个表现为API层面的互斥锁(lock()和unlock()方法配合try/finally语句块来完成),一个表现为原生语法层面的互斥锁。不过重入锁比synchronized增加了以下三项:
等待可中断:是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情,可中断特性对处理执行时间非常长的同步块很有帮助。
可实现公平锁:公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁;而非公平锁则不保证这一点。synchronized中的锁是非公平的,重入锁缺省也是非公平的,但可以通过带布尔值的构造函数要求使用公平锁。
锁可以绑定多个条件:是指一个重入锁对象可以同时绑定多个Condition对象,而在synchronized中,锁对象的wait()和notify()或notifyAll()方法可以实现一个隐含条件,如果要和多于一个的条件关联的时候,就不得不额外的添加y一个锁,而重入锁无须这样做,只需要多次调用newCondition()方法即可。
3.2非阻塞同步
互斥同步最重要的问题就是进行线程阻塞和唤醒所带来的性能问题,它属于一种悲观的并发策略,总是认为只要不去做正确的同步措施就会出现问题。但是我们有了另外一个选择:基于冲突检测的乐观并发策略,通俗的说就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据发生了争用,产生了冲突,那就再进行其他的补偿措施,这种乐观的并发策略的许多实现都不需要把线程挂起,因此被称为非阻塞同步。
总结
以上就是本文关于Java线程安全基础概念解析的全部内容了,希望对大家有所帮助,也希望大家多多支持小牛知识库。
下面介绍 BindingX 中涉及到的一些核心概念,它们分别是 表达式 、 事件类型 、 属性变换 。要想使用 BindingX 必须先理解这些概念。 表达式(Expression) 表达式,是由数字、运算符、变量等以能求得数值的有意义排列方法所得的组合。譬如, x\*3+10 就是一个表达式,当x被赋值时,整个表达式就会有一个明确的结果。通过表达式,我们就可以描述一个具体的交互行为,比如我们希望
概述 本书主要讲解的是关于 Java 在分布式系统中的应用。本书的读者假设都具备了 Java 的基础知识。 如果你需要了解有关 Java 基础知识,可以参阅笔者的另外一本开源书《Java 编程要点》。 分布式系统的概念 《分布式系统原理与范型》一书中是这样定义分布式系统的: 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像是单个相关系统。 这里面包含了2个含义: 硬件独立:计算机机器本
本文向大家介绍java语言注解基础概念详解,包括了java语言注解基础概念详解的使用技巧和注意事项,需要的朋友参考一下 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃; 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期; 3、Retenti
主要内容:关于版本控制,本地版本控制系统,集中化的版本控制系统,分布式版本控制系统本章关于开始学习 Git。这篇文章将从介绍有关版本控制工具的一些背景知识开始,然后讲解如何在系统运行 Git,最后是关于如何设置 Git 开始工作。 通过本章的学习,了解为什么 Git 这么流行,为什么要使用 Git 以及应该如何设置以便使用 Git。 关于版本控制 什么是“版本控制”?为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。在本书所展示的
就像 Reducers 中描述的一样,一个 Redux reducer 函数需要具备: 应该有类似 (previousState, action) => newState 特征的函数,函数的类型与 Array.prototype.reduce(reducer, ?initialValue) 这个函数很相似。 应该是"纯"函数,纯函数意味着不能突变(原文 mutate,意指直接修改引用所指向的值)它
描述Istio的授权和认证功能。 双向TLS认证。描述Istio的双向TLS认证架构,这个架构提供强服务身份和服务间加密通讯通道。