1,饿汉模式/单例模式,一开始就新建一个静态变量,后面用getInstance()都是同一个变量 2,懒汉模式/单例模式,在getInstance()才会new一个对象,在第一个有了后不会继续创建 3,懒汉模式有线程不安全问题,用double-check lock方法,(检查两次null,再用同步锁 4,处理同步,1,多个对象,2,ThreadLocal 5,线程出现异常的捕捉方法,1,new 一个UncaughtExcptionHanler()重写里面的uncaughtException(Th…
一. 在线程中运行任务 无限制创建线程的不足 .线程生命周期的开销很高 .资源消耗 .稳定性 二.Executor框架 Executor基于生产者-消费者模式.提交任务的操作相当于生产者.运行任务的线程则相当于消费者. 1. Executors 返回 ExecutorService 2. ExecutorService方法submit.execute 3. ExecutorService.submit 返回 Future 线程池,Executors方法介绍 方法名 解释 newFixedThre…
一.第一章 1.自定义线程类中实例变量针对其他线程有共享和不共享之分,自定义线程中的变量,如果是继承自thread类,则每个线程中的示例变量的更改,不影响其他线程2.当多个线程去访问一个局部变量是会产生 非线程安全的问题,需要加synchronize 关键字3.isAlive() 方法,判断当前的线程是否处于活动状态,已启动,且未终止.4.sleep() 方法,在指定的毫秒数内,让当前正在执行的线程休眠,但不释放锁5.停止,中断一个线程,可用stop(已废弃),推荐用interrupted()…
1,Timer timer = new Timer(true)现在是守护进程 2,timer是按照顺的,没有异步 3,timer方法,schedule(TimerTask task, Date firstTime, long perid)perid就是重复延时,firstTime提前则是执行完立即启动 4,线程内sleep的时间算在perid里面,不会重新算,就是不延时正常,延时接着上一个 5,TimerTask方法,canel取消自己任务 6,Timer方法,canel取消自己任务 7,在外部…
1,ReentrantLock 2,object的wait(),wait(x),notify(),notifyAll(),分别等于Condition的await(),await(x,y),signal(),signalAll() 3,new ReentrantLock(boolean)boolean可以是公平锁或者非公平锁,默认非公平 4,lock方法,getHoldCount()当前线程调用lock()数,即调用(锁)了几次 5,lock方法,getQueueLength()获得等待获得锁的…
1,notify的同步块完了,才会运行wait的同步块 2,interrupt()不是静态方法,用在wait的线程上会有InteruptException,锁也会被释放 3,notify()唤醒的线程是随机的,以前不知道唤醒哪个,了解到notify是object对象有的,哪个用相关的对象锁了,就会解锁哪个 4,object.wait(5000)期间没有notify,自己也会自动唤醒 5,join()public final void,内部使用wait(),相当于在当前线程阻塞的方法,打断会有异常…
任务:通常是一些抽象的且离散的工作单元.大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一.在线程中执行任务 任务的独立性:任务并不依赖于其他任务的状态,结果和边缘效应.独立的任务可以实现并行执行 1.串行的执行任务 所有的任务放在单个线程中串行执行,程序简单,安全性高,不涉及同步等情况,缺点也显而易见,无法提高吞吐量和响应速度,适合任务数量很少并且执行时间很长时,或者只为单个用户使用,并且该用户每次只发出一个请求. 2.显示的…
ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ______________ 后台进程 : 程序结束 ,则后台进程随之结束. 多个线程都可能访问,有共享,就要考虑线程安全. Timer : 开启新线程,  timerTask 如果访问程序中的数据,那么该数据的访问需要是线程安全的,简单方法:将线程安全封装在共享数据内部.timer:AtFixed是从上次开始时间算起.不…
1.线程池 众所周知创建大量线程时代价是非常大的: - 线程的生命周期开销非常大:创建需要时间,导致延迟处理请求,jvm需要分配空间. - 资源消耗:线程需要占用空间,如果线程数大于可用的处理器数量,那么线程就会闲置,这给Gc造成压力.线程在竞争cpu的时候也会造成性能开销,所以线程不是越多越好,使用不当并不会增加运行效率. - 稳定性:使用不当会造成内存溢出. 继而就引申出线程池. 1.1线程池的创建 Executors框架:静态方法创建 newCachedThreadPool:创建可变线程数…
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主在命令行应用程序中,客户端可以访问服务元数据,并以异步的方式消费它. 首先,我们创建了一个WCF服务.关于如何创建WCF服务,可以参考我之前的文章(WCF学习之旅—第三个示例之一(二十七)至WCF学习之旅—第三个示例之五(三十一)) 然后,我们为了调用了上面示例中已经存在的异步调用方式,在之前客户端…