文档章节

JAVA并发编程学习:线程

HenrySun
 HenrySun
发布于 2016/08/25 14:12
字数 1089
阅读 29
收藏 2

并发处理的基础—线程

  多个程序在各自的进程中独立运行,由操作系统来分配资源,比如内存文件句柄安全证书。进程之间也可以通过共享内存Sokcet信号处理信号量文件相互通信,线程是进程的基本单元,它是控制和利用多处理器系统计算能力的最简单方式

  线程允许程序控制流的多重分支存在于同一进程,它们共享进程范围内的资源,例如内存和文件句柄,但是每一个线程有自己的程序计数器本地变量,由于线程共享所属进程的内存地址空间,因此同一进程中的线程访问相同的变量,并从同一个堆中分配对象,虽然这样可以实现良好的数据共享,但是会造成多个线程间的同步问题(线程的另外两个问题是活跃度失败包括死锁和由于上下文切换造成的性能下降)

线程安全

  所谓线程安全,本质上就是管理对状态的访问,通常是共享的、可变的状态,一个对象的状态就是它的数据,存储在状态变量中,比如实例域或静态域。对象的状态还包括其他附属对象的域,例如HashMap的状态一部分存储到对象本身,但同时也存储到很多Map.Entry对象中。一个对象的状态包含了任何会对它外部可见行为产生影响的数据。无状态对象永远是线程安全的

竞争条件

  当计算的正确性依赖于运行时中相关的程序或者多线程的交替时,会产生竞争条件,其大多数的特点是使用潜在的过期观察值来作决策或执行计算,也被称作检查再运行:你观察到事情为真(文件X不存在),然后基于你的观察去执行一些动作(创建文件X);但事实上,从观察到执行操作的这段时间内,观察结果已经无效了(有人在此期间创建了文件X),从而引发错误(非预期的异常,重写数据或者破坏文件)

  这里的竞争条件不同于数据竞争,后者出现于没有使用同步来协调所有那些共享的非final域访问的情况。一个线程写入一个变量,可以被另一个线程读取;一个线程读取刚刚被另一个线程写入的变量,如果两个线程都没有使用同步,就会处于数据竞争的风险中

惰性初始化中的竞争条件

package com.henrysun.javaSE.bfbc;

import com.henrysun.model.User;

/**
 * 惰性竞争条件,不要这样做
 * @author Sam Flynn
 *
 */
public class JingZhengTiaoJianDuoxing {

	private User instance=null;
	
	public User getInstance() {
		if(instance==null)
			instance=new User();
		return instance;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
	}

}

  如果LazyInitRace是一个用户注册器,用于为持久性框架生成实体标识符,两个对象会由于相同的ID而消亡,因为它们破坏了标识符的完整性约束

内部锁

  详见Java synchronized详解

重进入机制

  当一个线程请求其他线程已经占有的锁时,请求线程将被阻塞。然后内部锁是可重进入的,因此线程在试图获得它自己占有的锁时,请求会成功。重进入意味着锁的请求是基于“每线程”,而不是基于“每调用”的。

  重进入的实现是通过为每个锁关联一个请求计数和一个占有它的线程,当计数器为0时,认为锁是未被占有的。线程请求一个未被占有的锁时,JVM将记录锁的占有者,并将请求计数置为1.如果同一个线程再次请求这个锁,计数将递增;每次占用线程退出同步块,计数器值将递减。直到计数器为0时,锁被释放。

  如果内部锁不是可重入的,代码将死锁

public class Widget
{
   public synchornized void doSomething(){
    ...   
    }
}

public class LoggingWidget extends Widget
{
     public synchronized void doSomething()
{
      System.out.println(toString()+" :caling doSomething");
      super.doSomething();
}
}

 

© 著作权归作者所有

HenrySun
粉丝 89
博文 121
码字总数 41919
作品 0
深圳
高级程序员
私信 提问
Java并发编程面试必备的知识点!

相信不用我说,大家也都知道掌握并发编程对于一个 Java 程序员的重要性。但相对于其他 Java 基础知识点来说,并发编程更加抽象,涉及到的知识点很多很零散,实际使用也更加麻烦。以至于很多人...

架构师技术联盟
03/05
0
0
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
Java面试需要准备哪些多线程并发的技术要点

一、概念 什么是线程 一个线程要执行任务,必须得有线程 一个进程(程序)的所有任务都在线程中执行的 一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务 多线程原理 同一...

码蚁说架构
2018/05/31
0
0
Java多线程学习(五)线程间通信知识点补充

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java8

package com.shi.lambda;import java.util.Arrays;import java.util.List;import org.junit.Test;import com.shi.model.Employee;/** * 初始化案例 * @author xiaosh......

小小小施爷
18分钟前
1
0
c# 动态编译代码

有时候做计算一些东西时候,算法一直变更,写在程序需要一直调整,因此算法写在cs文件,然后动态调用内部的方法去计算判断,只需变更cs文件即可。 static void Main() { Stopwatch watch = n...

朝如青丝暮成雪
19分钟前
2
0
好程序员技术分享html5和JavaScript的区别

好程序员技术分享html5和JavaScript的区别,HTML5广义上讲是前端开发学科的代名词,包含HTML5、CSS3及JavaScript三个重要的部分,是运行在浏览器上应用的统称。如PC端网站、管理系统、手机网...

好程序员IT
21分钟前
1
0
tomcat 与 spring boot 设置虚拟路径

tomcat 设置虚拟路径 <Context path="/uploadDir" docBase="/data"/>path是请求访问的路径docBase是服务器存储文件的路径,Linux 根目录下 data spring boot 虚拟路径设置 registry.addRe......

kdy1994
24分钟前
1
0
var ,let ,const 的区别和共同点

一、let和var区别 1.关于变量提升,var能变量提升,let不能 // 关于var 如下所示console.log(a); //输出undefined,此时就是变量提升var a = 2; console.log(a); //2 //相当于下面...

MrBoyce
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部