智能运营助手线程池原理剖析锁的深度化_第1页
智能运营助手线程池原理剖析锁的深度化_第2页
智能运营助手线程池原理剖析锁的深度化_第3页
智能运营助手线程池原理剖析锁的深度化_第4页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

线原理分析&锁的深度线什么是都可以使用线。在开发过程中,合理地使用线能够带来3个好处。线作线的分Java资源的,因为java提供了线。在jdk1.5以前的版本中,线的使用是及其简陋的,但是在JDK1.5后,有了很大的改善。JDK1.5java.util.concurrent,java.util.concurrentExecutor(JDK1.52004),但是很多程序员对于其中的一些原理ExecutorThreadPoolExecutor类,ExecutorsnewScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其实也只是ThreadPoolExecutor下的线那么它的底层原理是怎样实现的呢这篇就来介绍下ThreadPoolExecutor线的运行过程corePoolSize:池的大小。当有任务来之后,就会创建一个线程去执行任务,当线中的线程数corePoolSizeumPoolSize:线最大线程数,它表示中最多能创建多少个线程keepAliveTime:unit:keepAliveTime7TimeUnit7线四种创建方Java通过Executors(jdk1.5并发包)提供四种线,分别为newFixedThreadPool创建一个定长线,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool创建一个定长线,支持定时及周期性任务执行。newSingleThreadExecutor创建一个单线程化的线,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。创建一个可缓存线,如果线长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下////无限大小 jvm自动回ExecutorServicenewCachedThreadPool=Executors.newCachedThreadPool();for(inti=0;i<10;i++){finalinttemp=i;newCachedThreadPool.execute(newRunnable(){publicvoidrun(){try{}catch(Exceptione)//TODO:handle}System.out.println(Thread.currentThread().getName()+",i:"+}}}总结:线为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不创建一个定长线,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下ExecutorServiceExecutorServicenewFixedThreadPool=Executors.newFixedThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newFixedThreadPool.execute(newRunnable(){publicvoidrun()System.out.println(Thread.currentThread().getId()+",i:"+}}总结:因为线大小为3,每个任务输出index后sleep2秒,所以每两秒打印3个数字定长线的大小最好根据系统资源进行设置。如创建一个定长线,支持定时及周期性任务执行。延迟执行示例代码如下ScheduledExecutorServiceScheduledExecutorServicenewScheduledThreadPool=Executors.newScheduledThreadPool(5);for(inti=0;i<10;i++){finalinttemp=i;newScheduledThreadPool.schedule(newRunnable(){publicvoidrun()System.out.println("i:"+}},3,}表示延迟3秒执创建一个单线程化的线,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。示例代码如下ExecutorServiceExecutorServicenewSingleThreadExecutor=Executors.newSingleThreadExecutor();for(inti=0;i<10;i++){finalintindex=i;newSingleThreadExecutor.execute(newRunnable(){publicvoidrun(){System.out.println("index:"+index);try{}catch(Exceptione)//TODO:handle}}}注意:结果依次输出,相当于顺序执行各个任务线原理剖提交一个任务到线中,线的处理流程如下2、线判断工作队列是否已满,如果工作队列没有满,则将新提交的任务在这个工作队列里。如合理配置任务的性质:CPU,IO置Ncpu+1个线程的线。IO密集型任务则由于需要等待IO操作,线程并不是一直在执行任务,则配2*NcpuCPUIORuntime.getRuntime().availableProcessors()CPU执行,需要注意的是如果一直有优先级高的任务提交到队列里,那么优先级低的任务可能不能执行CPU。I/O前者称为计算密集型(CPU)computer-bound,I/O,I/O-boundJava锁的深度悲观锁、乐观锁、排他场悲观锁与乐观block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机Select*fromxxxfor重入JAVAsynchronized和publicclassTestimplementspublicclassTestimplementsRunnablepublicsynchronizedvoidget()System.out.println("name:"+Thread.currentThread().getName()+"get();");}publicsynchronizedvoidset()System.out.println("name:"+Thread.currentThread().getName()+"}publicvoidrun(){}publicpublicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();newThread(ss).start();newThread(ss).start();}}publicclassTest02extendsThread{ReentrantLockpublicclassTest02extendsThread{ReentrantLocklock=newReentrantLock();publicvoidget(){}publicvoidset(){}publicvoidrun(){}publicstaticvoidmain(String[]args){Testss=newTest();newThread(ss).start();newThread(ss).start();new}}读写Java(LocksinJava)Lock任何问题,所以应该允许多个线程能在同时共享资源。但是如果有一个线程想去写这些共享资源,不能共存)。这就需要一个读/写锁来解决这个问题。Java5java.util.concurrentpublicpublicclassCachestaticMap<String,Object>map=newHashMap<String,Object>();staticReentrantReadWriockrwl=newReentrantReadWriock();staticLockr=rwl.readLock();staticLockw=rwl.wri//获取一个key对应的publicstaticfinalObjectget(Stringkey)try{System.out.println("正在做读的操作,keykey开始Objectobject=System.out.println("正在做读的操作,keykey结束");return}catch(InterruptedExceptione)}finally}return}//设置key对应的value,并返回旧有的publicstaticfinalObjectput(Stringkey,Objectvalue)try{System.out.println("正在做写的操作,keykey",valuevalue开始.");Objectobject=map.put(key,System.out.println("正在做写的操作,keykey",valuevalue结束.");return}catch(InterruptedExceptione)}finally}return}}publicstaticfinalvoidclear()try{}finally}}publicstaticvoidmain(String[]args){newThread(newRunnable(){publicvoidrun()for(inti=0;i<10;i++){Cache.put(i+"",i+"");}}newThread(newRunnable()publicvoidrun()for(inti=0;i<10;i++){Cache.get(i+"");}}}}CAS无锁机与锁相比,使用比较交换(CAS)会使程序看起来更加复杂一些。但由于其非阻塞性,它就凭借这两个优势,就值得我们尝试使用无锁的并发CAS算法的过程是这样:它包含三个参数CAS(V,E,N):V表示要更新的变量,E表示预期值,N表示V等于E会将V设为N,如果V值和E说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS当前VCAS操作是抱观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CASCASJDK5.0Atomicallyincrementsbyonethecurrent*@returntheupdatedpublicfinalintincrementAndGet(){for(;;){//intcurrent=//intnext=current+ if(compareAndSet(current,next))returnnext;}}自旋privateAtomicReference<Thread>privateAtomicReference<Thread>sign=newpublicvoidlock()Threadcurrent=whilepareAndSet(null,current))}}publicvoidunlock()Threadcurrent=Thread.currentThread();pareAndSet(current,null);}publicpublicclassTestimplementsRunnable{staticintsum;privateSpinLockpublicTest(SpinLocklock){this.lock=lock;}@param@throwspublicstaticvoidmain(String[]args)throwsInterruptedException{SpinLocklock=newSpinLock();for(i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论