pingh14

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

01 2014 档案

摘要:http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/index.html?ca=drs-https://visualvm.java.net/zh_CN/gettingstarted.htmlhttp://blog.csdn.net/fenglibing/article/details/6298326http://freewind.me/blog/20111023/479.html 阅读全文
posted @ 2014-01-08 16:42 pingh14 阅读(170) 评论(0) 推荐(0)

摘要:Java 语言中的 volatile 变量可以被看作是一种 “轻量级的synchronized”;与synchronized块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性:互斥(mutual exclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加 阅读全文
posted @ 2014-01-07 00:01 pingh14 阅读(447) 评论(0) 推荐(0)

摘要:合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性,如果线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。第四:提供定时执行、定期执行、单线程、并发数控制等功能。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。Java里面线程池的顶级接口是Executor,但是严格意义上讲Execu 阅读全文
posted @ 2014-01-06 02:05 pingh14 阅读(615) 评论(0) 推荐(0)

摘要:CountDownLatch的介绍和使用:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达0之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。使用场景:在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 这个时候就可以使用CountDo 阅读全文
posted @ 2014-01-06 00:24 pingh14 阅读(1498) 评论(2) 推荐(0)

摘要:乐观锁 每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止悲观锁 是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁可以使用volatile+CAS原语实现,读取内存值的方式实现了乐观锁,方法:第一,比较内存值和期望值;第二,替换内存值为要替换值。悲观锁可以使用synchronize的以及Lock。CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。例如AtomicInteger的incrementAndGet的实现就用到了compareAndSet(CAS),如下代码所示 阅读全文
posted @ 2014-01-04 23:16 pingh14 阅读(1021) 评论(0) 推荐(0)

摘要:摘要从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些。场景1:如果已加锁,则不再重复加锁a、忽略重复加锁。b、用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发)。以上两种情况多用于进行非重要任务防止重复执行,(如:清除无用临时文件,检查某些资源的可用性,数据备份操作等)if (lock.tryLock()) { //如果已经被lock,则立即返回false不会等待,达到忽略操作的效果 try { //操作 } finally { lock.unlock(); }}场景2:如果发现该操作已... 阅读全文
posted @ 2014-01-03 23:36 pingh14 阅读(2228) 评论(0) 推荐(0)

摘要:1,java中有几种方法可以实现一个线程?答:在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法。这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runnable接口了,因为Java只允许单继承的。常见错误:调用run()方法而非start()方法创建并运行一个线程所犯的常见错误是调用线程的run()方法而非start()方法,如下所示:Thread newThread = new Thread(MyRunnable());newThread.run();起初你并不会感觉到有什么不妥, 阅读全文
posted @ 2014-01-03 00:14 pingh14 阅读(333) 评论(0) 推荐(0)

摘要:Semaphore:动态增减信号量,用于控制对某资源访问的同一时间的并发量。类似于令牌,谁拿到令牌(acquire)就可以去执行了,如果没有令牌则需要等待。【如何获取】:semaphore.tryAcquire(),尝试获取,不阻塞。semaphore.acquire(),没信号量可用时,将进行阻塞等,可以被中断。acquireUninterruptibly():获取信号量,将进行阻塞,但会忽略线程的中断而且不会抛出任何异常。【如何释放】:semaphore.release();线程抛出各种异常,都别忘了在finally中释放信号量;如果释放的比获取的信号量还多,例如获取了2个,释放了5次,那 阅读全文
posted @ 2014-01-02 22:27 pingh14 阅读(686) 评论(0) 推荐(0)