2016年2月

什么是线程池:

  • 创建和销毁对象是非常耗费时间的

    • 创建对象:需要分配内存等资源
    • 销毁对象:虽然不需要程序员操作,但是垃圾回收器会在后台一直跟踪并销毁
  • 对于经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
  • 思路:创建好多个线程,放入线程池中,使用时直接获取引用,不使用时放回池中。可以避免频繁创建销毁、实现重复利用。
  • 生活案例:在某处借用和归还电脑,共享单车。
  • 技术案例:线程池、数据库连接池

- 阅读剩余部分 -

线程组——顶级线程组是system

public class Test {
    public static void main(String[] args) {
        Thread thread  = new TeacherThread();
        System.out.println(thread.getName());   //Thread-0
        System.out.println(thread.getThreadGroup().getName());  //main
        System.out.println(thread.getThreadGroup().getParent().getName());  //system
        System.out.println(thread.getThreadGroup().getParent().getParent());  //null
    }
}

一个线程没有指定线程组,有默认的线程组

- 阅读剩余部分 -

通信之前必须同步

通信之前必须同步

通信之前必须同步

线程通信所用到的三个方法——都在Object类中,必须由同步监视器调用:

  • wait() :进入阻塞状态,进入当前同步监视器的阻塞队列 ,并释放锁
  • wait(time) :等待指定时间,到时间后即使没有唤醒,也会醒
  • notify():通知/唤醒 的是使用同一个同步监视器的,等待队列中的1个线程(随机的)
  • notifyAll() :通知/唤醒 的是使用同一个同步监视器的,等待队列中的所有线程

- 阅读剩余部分 -

Lock锁

  • jdk1.5后的新增功能,与采用synchronized相比,lock可提供多种锁方案(多个是实现类),更灵活
  • import java.util.concurrent.locks.Lock中的Lock框架是锁定的一个抽象,它允许把锁的实现作为java类,而不是作为语言特征(关键字)来实现,这就为Lock的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。
  • ReentrantLock类实现了Lock ,它拥有与synchronized相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。

注意:如果同步代码块有异常,要将unlock()写入finally语句块内

LOCK锁和synchronized的区别

  1. lock锁是显示锁(手动加锁开锁),synchronized是隐式锁
  2. lock只有代码块锁,synchronized有代码块锁和方法锁
  3. 使用Lock锁,jvm将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)

- 阅读剩余部分 -