Java 多线程
0 引言
进程:一个正在执行中的程序,动态的,是系统进行资源分配和调度的独立单位。
线程:进程中一个独立的控制单元,线程控制着进程的执行。一个进程中至少有一个线程。
1 创建线程
创建线程的方式:Thread、Runable
继承 Thread 类三步走:定义类继承 Thread 类、重写 run 方法、调用线程的 start 方法。
实现 Runable 接口三步走:定义类实现 Runable 接口、实现 run 方法、通过 Thread 类建立线程对象、start方法。
两种方式的区别:实现方式避免了单继承的局限性,线程代码存在接口子类的 run 方法中;继承方式线程代码存放在 Thread 子类的 run 方法中。
线程的生命周期:就绪状态(线程 new 后)、可执行状态(start 方法启动线程,调用 run 方法)、阻塞状态(sleep 方法 和 wait 方法)、死亡状态(stop 方法)
2 内存模型
java的内存模型,详见 JVM原理
2.1 volatile(用来修饰被不同线程访问和修改的变量)
1. 内存可见性:某线程对 volatile 变量的修改,对其他线程都是可见的。即获取 volatile 变量的值都是最新的。
2. 禁止指令重排:JVM 在编译 Java 代码时或 CPU 在执行 JVM 字节码时,对现有指令顺序进行重新排序,优化程序的运行效率。
2.2 synchronized
防止多个线程同时访问这个对象。
2.3 synchronized和volatile的区别
1. volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
2. volatile仅能实现变量的修改可见性,并不能保证原子性;synchronized则可以保证变量的修改可见性和原子性
3. volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞
4. volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
3 wait和sleep方法
1. wait方法:会释放锁
2. notify/notifyAll:仅仅释放资源,不会释放锁
原文地址:https://www.cnblogs.com/huanghzm/p/11044972.html
- memcached程序端口监控脚本
- mysql操作命令梳理(5)-执行sql语句查询即mysql状态说明
- 【7】AccessDB快速数据访问
- 4.微信支付
- 【8】数据浏览表格的快速输出
- Silverlight的自定义tooltip提示工具条
- WritableBitmapEx 一瞥
- 2.认证小程序
- 【9】分页浏览的管理
- 温故而知新:silverlight中的图片资源绑定
- 页面状态保持机制(编辑中)
- mysql主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)
- ngx_pagespeed-nginx前端优化模块介绍
- Tomcat利用MSM实现Session共享方案解说
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- R语言ggplot2 对Facebook用户数据可视化分析
- 如何实现一个圆弧倒计时进度条
- R语言Kaggle泰坦尼克号性别阶级模型数据分析案例
- 以图搜图系统概述
- GitHub Pages 配置 letsencrypt 开启HTTPS
- R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据
- 以图搜图系统工程实践
- R语言线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)
- 用R语言实现神经网络预测股票实例
- R语言社区主题检测算法应用案例
- C++ vector学习笔记
- 锂电池充电慢?手把手教你制作锂电池快充充电器
- c++ cin, get学习笔记
- c++ sort 学习笔记
- CSS3 引入方式 注释 颜色属性 学习笔记