java多线程-笔记

来源:互联网 发布:淘宝助理订单下载 编辑:程序博客网 时间:2024/06/08 12:17
1、线程可以拥有自己的堆栈、程序计数器和局部变量,但是不拥有系统资源,与父进程的其他线程共享该进程拥有的全部资源。
2、线程们共享内存、文件句柄和其他每个进程应有的状态。(每个进程?)
3、

函数式接口

理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论。FI的定义其实很简单:任何接口,如果只包含 唯一 一个抽象方法,那么它就是一个FI。为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解。举个简单的例子,Runnable接口就是一个FI,下面是它的源代码:

@FunctionalInterfacepublic interface Runnable {
    public abstract void run();
}
4、调用线程对象的isAlive()方法测试某个线程是否已经死亡。
处于就绪、运行、阻塞状态时,返回true;
处于新建、死亡状态时,返回false。
5、不能对死亡的线程调用start方法,或者对新建状态的线程两次调用start方法,都将会抛出illegalThreadStateException.
6、
目前看到了16.5  线程同步
page730  758/878

7、synchronized(obj){ } obj就是同步监视器,线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。
比如银行取钱问题,使用synchronized将其改成同步代码快之后,同步代码块的同步监视器就是account对象,符合“加锁-修改-释放锁”的逻辑。
8、与同步代码块对应,还有 同步方法。
同步方法就是用synchronized关键字来修饰某个方法,对于synchronized修饰的实例方法(非static方法)而言,无须显式指定同步监视器,同步方法的同步监视器是this,也就是调用该方法的对象。
9、JDK提供的StringBuilder和StringBuffer就是为了照顾单线程环境和多线程环境。在单线程环境下应该使用StringBuilder保证较好的性能,当需要保证多线程安全的时候,应该使用StringBuffer。
10、程序应该尽量避免使用suspend()和resume()方法来控制线程。(容易导致死锁)
11、ReentrantLock锁具有可重入性。也就是说,可以对已被加锁的ReentrantLock锁再次加锁。reentrantlock对象会维持一个计数器来追踪lock方法的嵌套调用。
12、死锁≠程序阻塞。 比如存取钱的例子,取钱者线程已经执行结束,而存钱者线程只是在等待其他线程来取钱而已,并不是等待其他线程来释放同步监视器,不要把死锁和程序阻塞等同起来。
13、synchronized 隐式的同步监视器,用wait()  notify()  notifyAll() 来进行线程通信
使用lock对象保证同步时,不存在隐式的同步监视器,用condition类来保持协调。condition()实例被绑定在一个lock对象上。await()  signal() signalAll()
14、BlockingQueue是queue的子接口,但是主要用途不是容器,而是作为线程同步的工具。put(E e)  take( )
15、
进度  16.8 线程池  751   779/878
16、如果多个线程之间需要共享资源,达到线程之间通信的功能,就使用同步机制。如果仅仅需要隔离多个线程之间的共享冲突,就使用ThreadLocal。
0 0
原创粉丝点击