Java的编程逻辑--15章 并发基础
1、run()和start()的区别
2、线程的基本属性和方法
- id:一个递增的整数,每创建一个线程就加一
- name
- 优先级:从1到10,默认为5,会映射到系统中的优先级。数字越大,要优先级越高
- 状态:
- NEW :还没调用start
- RUNABLE:正在执行run或者正在等待cup分配时间
- BLOCKED:被阻塞
- WAITING:被阻塞
- TIMED_WAITING:被阻塞
- TERMINATED:结束
- 是否daemo线程
- sleep方法, 单位是毫秒
- yield方法,建议让出cpu
- join方法,join(0)或join()标示无限期等待
- 过时方法 stop(),suspend(),resume(),已经过时,不应再使用
3、竞态条件:当多个线程访问和操作同一个对象时,最终执行结果与执行时序有关,可能正确也可能不正确。
解决方案:
- 使用synchronized关键字
- 使用显示锁
- 使用原子变量
4、内存可见性:多个线程可以共享访问和操作相同的变量,但一个线程对一个共享变量对修改,另一个线程不一定马上就能看到,甚至永远也看不到。因为涉及到寄存器和各级缓存。
解决方案:
- 使用volatile关键字
- 使用synchronized关键字
5、synchronized
synchronized可用于修饰类的实例方法(保护this),静态方法(保护类对象),代码块(任意对象)。
synchronized保护的是对象而非代码,只要访问的是同一对象的synchronized方法,即使是不同的代码,也会被同步顺序执行。
所以多个线程是可以同时执行同一个synchronized实例方法的,只要他们访问的对象是不同的即可。
可重入性:通过记录锁的持有线程和持有数量来实现的。
保证内存可见性:在释放锁时,所有写入都会写回到内存,而获得锁后,都会从内存中读最新数据。
如果只是保证内存可见性,synchronized的成本有点高,
6、volatile : java会在操作对应变量时插入特殊的指令,保证读写到内存到最新值而非缓存到值,可以解决内存可见性问题
7、死锁
- 尽量避免在持有一个锁到同时取申请另一个锁
- 如果确实需要多个锁,所有到代码应该按照相同到顺序取申请锁
8、同步容器及注意事项
Collection中的一些方法,可以返回线程安全的同步容器
synchronizedXXX()
9、并发容器,专门为并发设计,因为同步容器的性能比较低
- CopyOnWriteArrayList
- ConcurrentHashMap
- ConcurrentLinkedQueue
- ConcurrentSkipListSet
10、线程的基本协作机制 :wait/notify
常见的协作场景:
Java的编程逻辑--15章 并发基础的更多相关文章
- java 面向对象编程-- 第15章 集合框架
1. 集合特点:元素类型不同.集合长度可变.空间不固定 2. java中对一些数据结构和算法进行了封装即集合.集合也是一种对象,用于存储.检索.操作和传输对象. 3. JCF(Java Coll ...
- Java笔记(十四) 并发基础知识
并发基础知识 一.线程的基本概念 线程表示一条单独的执行流,它有自己的程序计数器,有自己的栈. 1.创建线程 1)继承Thread Java中java.lang.Thread这个类表示线程,一个类可以 ...
- 2017年9月11日 梁勇 java教材 编程练习题 第二章 2.15 键盘 读取两个点的坐标值(小数),控制台输出两点间距离。
package com.swift; import java.util.Scanner; public class PToP { public static void main(String[] ar ...
- java多线程编程核心技术——第二章
第一节synchronized同步方法目录 1.1方法内的变量为线程安全的 1.2实例变量非线程安全 1.3多个对象多个锁 1.4synchronized方法与锁对象 1.5脏读 1.6synchro ...
- java多线程编程核心技术——第二章总结
第一节synchronized同步方法目录 1.1方法内的变量为线程安全的 1.2实例变量非线程安全 1.3多个对象多个锁 1.4synchronized方法与锁对象 1.5脏读 1.6synchro ...
- 《疯狂java讲义》笔记 1-5章
1.编译语言和解释语言理解,摘自李刚老师的<疯狂Java讲义>第三版: 就是说,Java和.net都是编译型有事解释型语言.编译型就是根据不同平台编译成不同的可执行机器码,编译过程中会进行 ...
- java面向对象编程— —第七章 继承
7.1继承的起源 继承(Inheritance),即在面向对象编程中,可以通过扩展(extends)一个已有的类,并继承该类的属性的行为,来创建一个新的类. 已有的类称为父类(也可以称为基类,超类), ...
- Java 网络编程(一) 网络基础知识
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951826.html 网络基础知识 网络编程的目的:直接或间接地通过网络协议与其他计算机 ...
- java学习之路--面试之并发基础
1. 什么是原子操作?在Java Concurrency API中有哪些原子类(atomic classes)?原子操作是指一个不受其他操作影响的操作任务单元.原子操作是在多线程环境下避免数据不一致必 ...
随机推荐
- Windows同步阿里云时间
Ctrl+R打开cmd命令框 输入:gpedit.msc 计算机配置”—“管理模版”—“系统”—“Windows 时间服务”—“时间提供程序”—“配置 Windows NTP 客户端 双击打开配置 W ...
- FineMessBox的js依赖导致错误Uncaught ReferenceError: addEvent is not defined
/** * COMMON DHTML FUNCTIONS * These are handy functions I use all the time. * * By Seth Banks ( ...
- zoj2112 主席树动态第k大 (主席树&&树状数组)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 彻底解决Request Too Long的问题
运行regedit,进入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters , 1. 添加类型为 DWORD(3 ...
- UITableView延伸:点击cell关闭键盘,加载不同cell,监听里面的textfeild内容改变
其实点击cell关闭键盘只要一句话 - () { cell = [tableView dequeueReusableCellWithIdentifier:){ cell ...
- iOS-APP图标和启动页的尺寸
图标
- [luoguP3953] 逛公园(DP + spfa)
传送门 看到求方案数,应该很容易想到dp f[u][i]表示到点u,且比到u的最短距离多i的方案数 那么需要先预处理dis数组,spfa或者堆优化的dijk 因为考虑到dp的顺序,f[u][i]转移到 ...
- echarts3样例
<script type="text/javascript" src="echarts.min.js"></script> <di ...
- msp430项目编程40
msp430综合项目---多路温度检测系统40
- Jsp中路径问题
${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的. <!--使用绝对路径的方式引入CSS文件-->& ...