24-多线程技术概述.docx

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

3344483cc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档