欢迎来到天天文库
浏览记录
ID:8795715
大小:20.45 KB
页数:10页
时间:2018-04-08
《java多线程、并发编程知识点总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、1、线程的状态 1.1创建线程的两种方式,接口和线程类。利用接口的好处:更好的体现面向对象的思想,可以避免由于Java的单继承特性而带来的局限; 增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;(同步问题)适合多个相同程序代码的线程区处理同一资源的情况。(关注微信订阅号:javaedu) 1.2线程就绪等待调度运行start()方法。 1.3线程的中断 这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。 1.4、线程挂起和恢复(挂起还拥有对象锁,死锁) 线程的挂起和恢复实现的正确方法是:通过设置标志位,让线程在
2、安全的位置挂起 1.5利用多线程模拟同步运行用jion方法,mThread.jion()表示该线程运行完毕后,在运行调用它的线程。 1.6sleep休眠 当线程执行Thread.sleep()时,它一直阻塞到指定的毫秒时间之后,或者阻塞被另一个线程打断; 1.7stop线程停止 stop方法突然终止线程(持有这些锁必定有某种合适的理由——也许是阻止其他线程访问尚未处于一致性状态的数据, 突然释放锁可能使某些对象中的数据处于不一致状态) 1.8线程可以阻塞于四种状态:(参考资料:t.cn/RA5iKhq) 当线程执行Thread.sleep()时,它一直阻塞到指定的毫秒时间之
3、后,或者阻塞被另一个线程打断; 当线程碰到一条wait()语句时,它会一直阻塞到接到通知(notify())、被中断或经过了指定毫秒时间为止(若制定了超时值的话) 线程阻塞与不同I/O的方式有多种。常见的一种方式是InputStream的read()方法,该方法一直阻塞到从流中读取一个字节的数据为止,它可以无限阻塞,因此不能指定超时时间 线程也可以阻塞等待获取某个对象锁的排他性访问权限(即等待获得synchronized语句必须的锁时阻塞)。 2、线程的种类 守护线程与线程阻塞的四种情况 Java中有两类线程:UserThread(用户线程)、DaemonThread(守护线程
4、) 用户可以用Thread的setDaemon(true)方法设置当前线程为守护线程。 守护线程是否已经完成了预期的服务任务。一旦所有的用户线程退出了,虚拟机也就退出运行了。 因此,不要在守护线程中执行业务逻辑操作(比如对数据的读写等)。、 setDaemon(true)必须在调用线程的start()方法之前设置,否则会跑出IllegalThreadStateException异常。 在守护线程中产生的新线程也是守护线程。 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。 3、线程所操作的数据 同步问题: 4、可重入内置锁 每个Java对象都
5、可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁。 线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁。 获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。 某一个持有同步对象锁的线程可以多次进入这个同步代码块或方法。即同步对象锁可以重入! 同一个线程在调用本类中其他synchronized方法/块或父类中的synchronized方法/块时,都不会阻碍该线程地执行,因为互斥锁时可重入的。 6、Java内存模型 在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。(本地内存+共享主存)
6、 Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。 这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 而volatile关键字就是提示JVM:对于这个成员变量,不能保存它的私有拷贝,而应直接与共享成员变量交互。 volatile型变量的特殊规则: 1、保证此变量对所有线程的可见性。需要注意,volatile变量的写操作除了对它本身的读操作可见外,volatile写操作之前的所有共享变量均对volatile读操作之后的操作可见 2、禁止指令重排序优化 final域能
7、确保初始化过程的安全性,从而可以不受限制地访问不可变对象,并在共享这些对象时无须同步 因此在编码时,不需要将long和double变量专门声明为volatile。 主内存与工作内存 Java内存模型规定所有的变量都存储在主内存中,而每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝, 线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。 根
此文档下载收益归作者所有