线程带来的风险

安全性:多线程操作执行顺序的不可预测性 -- 永远不发生糟糕的事情;

活跃性:代码无法得到执行,死锁、饥饿问题 -- 某件正确的事情最终会发生;

性能问题:活跃性只意味着某件事最终会发生,但不是尽快发生;

  • 线程安全性

  当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称为这个类是线程安全的。

  线程安全类中封装了必要的同步机制,所以客户端无需进一步采取同步措施。

  • 原子性

  竞态条件:基于一种可能失效的观察结果来做出判断或执行某个计算;

  要保持状态的一致性,就需要在单个原子操作中更新所有的相关状态变量;

  • 加锁机制

  内置锁

java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)

1 // java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)
2 // 同步代码块包含两部分
3 // 一个作为锁的对象引用,一个作为由这个锁保护的代码块
4 synchronized (lock) {
5 // 访问或修改由锁保护的共享状态
6 }

内置锁-同步代码块

重入:某线程试图获得一个已经由它自己持有的锁,这个请求会成功。重入的实现方式为,为每一个锁关联一个获取计数值和一个所有者线程,当计数值为0,这个锁认为没有任何线程持有。

重入避免了死锁情况的发生

// 如果内置锁不可重入,下面代码将发生死锁
public class Parent {public synchronized void doSomething() {}
}public class Children extends Parent {public synchronized void doSomething() {super.doSomething();}
}

锁的重入

  • 可见性

转载于:https://www.cnblogs.com/binnzhao/p/6063407.html

java并发编程-基础相关推荐

  1. Java并发编程基础--ThreadLocal

    Java并发编程基础之ThreadLocal ​ ThreadLocal是一个线程变量,但本质上是一个以ThreadLocal对象为键.任意对象为值的存储结构,这个结构依附在线程上,线程可以根据一个T ...

  2. Java并发编程的艺术-Java并发编程基础

    第4章 Java并发编程基础 ​ Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将 ...

  3. java 并发编程多线程_多线程(一)java并发编程基础知识

    线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...

  4. java并发编程入门_探讨一下!Java并发编程基础篇一

    Java并发编程想必大家都不陌生,它是实现高并发/高流量的基础,今天我们就来一起学习这方面的内容. 什么是线程?什么是进程?他们之间有什么联系? 简单来说,进程就是程序的一次执行过程,它是系统进行资源 ...

  5. Java并发编程 基础知识学习总结

    Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容,这部分的内容我也是反复学习了好几遍才能理解.本篇博客梳理一下最近从<Java 并发编程的艺术>和他人的博客学习Java并发 ...

  6. 【Java并发编程的艺术】读书笔记——Java并发编程基础

    学习参考资料:<Java并发编程的艺术> 文章目录 1.线程的几种状态 2.如何安全的终止线程 3.线程间通信(重要) 3.1共享内存 3.2消息传递 1.线程的几种状态 线程在运行的生命 ...

  7. Java并发编程基础-ReentrantLock的机制

    同步锁: 我们知道,锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源,在Lock接口出现之前,Java应用程序只能依靠synchronized关键字来实现同步锁 ...

  8. java并发编程基础—生命周期与线程控制

    一.线程生命周期 线程被创建启动以后,他既不是一启动就进入执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Bloc ...

  9. java并发编程基础系列(五): 创建线程的四种方式

    线程的创建一共有四种方式: 继承于Thread类,重写run()方法: 实现Runable接口,实现里面的run()方法: 使用 FutureTask 实现有返回结果的线程 使用ExecutorSer ...

  10. Java 并发编程 基础

    第一章 线程的操作 1.1创建多线程的方式 第一种:继承Thread 第二种:实现Runnable接口 1.2线程的常用方法 currentThread(): 获取当前线程 isAlive():判断当 ...

最新文章

  1. 2014.4新版uboot启动流程分析
  2. 从零开始的ROS四轴机械臂控制-目录
  3. 使用optuna为机器学习模型挑选最优参数进行模型构建实战
  4. Hologres揭秘:如何支持超高QPS在线服务(点查)场景
  5. android 仿网易标题栏,仿网易新闻可滑动标题栏TabLayout(文字或图标)
  6. Android RecyclerView使用详解(一)
  7. 54 岁的当当李国庆“杀入”区块链!
  8. python发布代码图片_gitpython模块与代码发布项目流程图
  9. emacs java_Emacs配置与使用
  10. win7系统sql连接不上服务器,Win7 安装软件时无法连接sql server解决方法
  11. .net core借助sendCloud实现邮件验证码发送
  12. 内外兼修 华润啤酒的“有为”哲学
  13. WebAssembly之wasm2c工具编译使用
  14. 数据仓库与元数据管理
  15. 2.4 矩阵的特征值与特征向量
  16. 计算机设备名称英语词汇
  17. html里高度的英文,高度是什么意思
  18. 【python入门篇——11】字典(dict)详解
  19. 零伽壹链改研究:区块链技术在支付及清结算的变革与创新!
  20. Unity3d动画脚本 Animation Scripting

热门文章

  1. leetcode 61. Rotate List
  2. NOIP2013/day1/1/转圈游戏
  3. 细说WCF中的会话模式
  4. 关于MOSS列表库新建列表项前的!New标识
  5. 转载 敏捷教练,从A到Z
  6. GARFIELD@01-01-2005
  7. 判断相等_为什么不建议你用a.equals(b)判断对象相等
  8. (76)FPGA面试题-Verilog实现下降沿检测
  9. (04)Verilog HDL模块仿真激励
  10. FPGA双沿发送之ODDR原语实现