1、进程与线程
进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动;是程序在一个数据集合上运行的过程,它对系统进行资源分配和调度的一个独立单位。
线程则可理解为在进程中独立运行的子任务,多线程可以最大限度地利用CPU的空闲时间来处理其他任务。
2、创建线程
创建线程有两种方法:继承Thread类,或实现Runable接口
以上以简单地方式实现多线程及运行结果。
3、关闭线程
3.1、stop()方法,现已作废。强制线程停止有可能导致一些清理工作得不到完成,其次使得对锁定的对象进行解锁,导致数据得不到同步处理,出现数据不一致问题。
3.2、interrupt()+return停止线程,while(true) {if (this.isInterrupted()) {return;}},配合t1.interrupt();
3.3、抛异常(推荐),catch块中可以对异常信息进行相关的处理,使用异常流能更好、更方便的控制程序的运行流程,不至于代码出现多个return造成污染。throw new InterruptedException();
4、暂停&恢复 suspend() resume(),独占同步对象,易锁死对象。
5、yield()作用是放弃当前CPU资源,放弃时间不确定,可能刚放弃又获取时间片。
6、setPriority()线程优先级,1-10个等级,具有继承性、规则性、随机性。
7、synchronized,对象锁,可重入锁,不可继承性。
synchronized同步方法:对其他synchronized同步方法和synchronized(this)呈阻塞状态,synchronized(this)亦然。
synchronized(非this对象x)不与synchronized同步方法或(this)互斥,但与对象x的同步方法互斥。
synchronized添加static方法或synchronized(class)是对类加锁,对类的所有实例起作用。
8、死锁满足条件:①互斥 ②不可剥夺 ③请求与保持 ④循环等待。
9、synchronized 和volatile的区别。
①关键字volatile是线程同步的轻量级实现,volatile的性能要优于synchronized,并且volatile只能修饰变量。
②多线程访问volatile不会发生阻塞,而synchronized会阻塞。
③volatile只保证可见性,不保证原子性。synchronized保证原子性,间接保证可见性。
④volatile保证多线程可见性,synchronized解决多线程访问资源的同步性。
10、volatile非原子性,同时也是非线程安全。线程read和load操作可以保证私有内存和公共内存变量同步,但当加载到私有内存后,公有内存数据发生改变,则此时私有内存和公共内存变量不同步,以致非线程安全。可使用AtomicInteger(Unsafe类实现)原子类,在没有锁的情况下也是线程安全的。
11、等待/通知机制,wait()方法是Object类方法,调用wait()之前,必须获得对象级别锁,且必须在同步方法或同步代码块中调用,调用后释放锁。notify()同理,但调用notify()之后,当前线程不会立即释放锁,需等程序执行完毕再释放锁,并随机选取一个wait状态的线程发出notify通知。同时wait可设置timeout,超过时间自动唤醒。(Thread.sleep()和Object.wait()方法,wait方法只能在同步代码块中执行,sleep()可以在任何地方执行;sleep不放弃锁,wait放弃锁,等待notify())
12、释放锁有三种情况:①执行完同步代码块 ②遇到异常到线程终止③执行wait()。
13、通过管道进行线程间通信,使用pipeOutputStream.connect(pipeInputStream)连接两个stream。
14、join()方法。主线程需要等待子线程执行完毕,在子线程同步代码块中使用join,类似于在内部使用wait()进行等待。
15、ThreadLocal<T>实现多线程数据隔离性。threadLocal.get()/set(T)。
16、InheritableThreadLocal<T>实现子线程从父线程中取得值。
17、ReetrantLock
①实现synchronized功能
②通过Condition condition =lock.newCondition();实现等待通知功能。wait()类似于condition.await(); notify()类似于signal();notifyAll()类似于signalAll()方法,使用方面也类型,需要lock.lock(),才能await()或者signal()
③公平锁于非公平锁,公平锁遵循FIFO,而非公平锁应用抢占机制。sync = fair ?new FairSync() :new NonfairSync();
④getHoldCount():当前线程保持此锁定的个数 getQueueLength():正等待此锁定的线程个数 hasQueuedThread(Thread t):查询指定线程是否正在等待获取此锁定
18、ReentrantReadWriteLock,lock.readLock().lock(),读写锁。写锁是互斥锁,读锁是共享锁或者可重入锁。
19、Timer定时器
①schedule(TimerTash task, Date time),可添加多个task,以队列形式存储,顺序执行。
②执行时间晚于当前时间,立即执行。
③初始化Timer,timer线程即启动,可设置为守护线程。
④TimerTask的cancle()方法,即清除本身任务,Timer的cancle()方法,清除定时器内所有任务。
总结:
《Java多线程编程核心技术》其实在上学的时候就读过,书上也写满了笔记,纸上的笔记也因为几次搬家而遗失。这次重新温习一篇,圈下个人认为的重点,日后再温习也方便。这本书,讲得还是很通俗易懂的,书内遍布例子,每个点高洪岩老师都讲得很清晰,很适合入门。
参考:《Java多线程编程核心技术》
网友评论