- 1、本文档共24页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多线程技术
多线程复习
进程:软件在内存中的分配的独立空间。
线程:进程中负责独立运行某些功能的子空间。
多线程:一个软件中多个线程同时并发运行。
Java中使用Thread类描述线程这个事物。
创建线程有两种方式:
1、继承Thread类
定义类继承Thread类,子类就是一个线程类
重写run方法,其实是在明确线程要执行的任务
创建子类对象,这时就已经有了线程对象
开启线程。调用start方法。
2、实现Runnable接口
定义类实现Runnable接口,相当于明确了线程要执行的任务类
实现run方法,明确线程要执行的任务
创建实现类对象,有了线程的任务对象
创建Thread对象,这时就有了线程对象,需要将任务对象传递给线程对象
开启线程。调用start方法
多线程的安全问题:
多个线程同时操作共享的数据,并且操作共享数据的语句不止一条。对数据有其他的操作(修改等),线程
在执行多个语句的时候在中间可能切换到其他的线程上。导致数据错乱。
安全的解决:
问题的本质是CPU的随机切换。我们通过同步代码块锁定操作共享数据的代码。当有线程在同步中的时
候,及时cpu切换到其他的线程上,线程也无法进入到同步中。这样保证安全。但是降低了程序的执行
效率。
同步代码块的格式:
synchronized( 任意锁对象 ){
操作共享数据的代码
}
如果程序加入了同步,安全问题依然发生:
同步的位置是否正确。
同步使用的锁对象是否是唯一的。
单例懒汉式的安全问题:在getInstance方法中if判断和赋值是在操作共享的数据,这时就形成可能切换,导致发生安全问题。
和同步相关的类:
StringBuilder:不同步,不安全,单线程效率高。
StringBuffer:同步,安全,多线程操作时效率低。
从JDK1.2之后的集合类都是线程不安全的。只有Vector和Hashtable是线程安全的。
如果需要线程安全的集合,需要使用Collections是中的工具方法将JDK1.2之后的集合转成安全集合。
多线程中的其他问题
单例懒汉式的安全问题
单例设计模式
设计模式:解决问题的有效方案。
单例:解决的对象唯一的问题。
单例的书写步骤:
私有本类构造方法
创建本类对象
对外提供获取本类对象的方法
单例常用的两种代码书写格式
饿汉式
class Single{
private Single(){};
private static final Single instance = new Single();
public static Single getInstance(){
return instance;
}
}
懒汉式
class Single{
private Single(){}
private static Single instance = null;
public static Single getInstance(){ //t0 //t1
if( instance == null ){
//t0 //t1
instance = new Single();
}
return instance;
}
}
面试:
单例的思想。保证对象唯一
为什么要加静态:静态的目的是让外界可以通过类名直接调用方法获取本类对象。
懒汉式有没有多线程的安全问题?
有安全问题。
问题:在getInstance方法中,需要先判断,在创建单例的对象,而判断和创建对象属于两条Java代码,这时CPU就有可能在两行代码之间切换到其他的线程上。就会导致每个线程创建出自己的对象返回。那么单例类不再唯一。
怎么解决:加入同步
加入同步效率降低,怎么解决:
/*
* 单例设计模式中的懒汉式的安全问题和解决
*/
class Single{
private Single(){}
private static Single instance = null;
private static Object lock = new Object();
public static Single getInstance(){
/*
* 加入判断,提高效率
* 在同步的外面加入的判断,目的是为后续来的线程获取对象提高效率
* 后续的线程在进入到getInstance方法获取对象的时候,直接判断instance
* 只要不为null,这时他们就不会进入到同步中。也就不用判断是否有锁
*/
if( instance == null ){
//加入同步保证
文档评论(0)