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)?原子操作是指一个不受其他操作影响的操作任务单元.原子操作是在多线程环境下避免数据不一致必 ...
随机推荐
- caffe+vs2013+window10+GPU(CPU)配置
参考:http://www.echojb.com/cuda/2017/03/15/350138.html https://www.zhihu.com/question/56111727 第一步:首先确 ...
- 分析nginx日志常用的命令总结
1. 利用grep ,wc命令统计某个请求或字符串出现的次数 比如统计GET /app/kevinContent接口在某天的调用次数,则可以使用如下命令: cat /usr/local/nginx/l ...
- nginx中access_log和nginx.conf中的log_format用法
nginx服务器日志相关指令主要有两条: 一条是log_format,用来设置日志格式; 另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小 可以参加ngx_http_log_ ...
- web.xml不同的头文件
<转自:http://blog.csdn.net/qq_16313365/article/details/53783288> 1. Servlet 3.1 Java EE 7 XML sc ...
- BZOJ 2331 [SCOI2011]地板 ——插头DP
[题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...
- [BZOJ1579] [Usaco2009 Feb]Revamping Trails 道路升级(分层图最短路 + 堆优化dijk)
传送门 dis[i][j]表示第i个点,更新了j次的最短路 此题不良心,卡spfa #include <queue> #include <cstdio> #include &l ...
- POJ3345 Bribing FIPA
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5021 Accepted: 1574 Description There ...
- 济南学习 Day 5 T3 pm
科普一下: φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数.φ(1)= ...
- Highcharts 动态制作3D柱状图
学习参考菜鸟网站:http://www.runoob.com/highcharts/highcharts-tutorial.html 我是通过后端返回设备数据,进行前端出图,效果如下: 代码如下: d ...
- (3)Swing常用组件
JTextField-文本框 继承自javax.swing.text.JTextComponent类