java多线程编程核心技术

一、多线程的技能

1.创建线程的两种方式:继承Thread类或者实现Runnable接口

2.同一个线程如果多次调用start()方法,则会抛异常

3.如果调用线程的run方法就不是异步了,而是同步,失去线程的特性

4.执行start()方法的顺序不代表线程启动的顺序

5.使用继承Thread类的方式来创建线程是有局限性的,因为java是单根继承的,不支持多继承,所以为了改变这种机制,可以实现Runnable接口

6.currentThread()方法可返回代码段正在被哪个线程调用

7.isAlive()方法是判断当前线程是否处于活动状态

8.活动状态就是线程已经启动且尚未终止,线程正在运行或者准备开始状态

9.sleep()方法是在指定的毫秒数内让线程休眠,这个正执行的线程是this.currentThread()返回的线程

10.interrupt()方法只是在当前线程打了一个停止的标记,不是真正的停止线程

11.this.interrupted():测试当前线程是否已经是中断状态,执行后会将状态表示设置为false

12.this.inInterrupted():测试线程Thread对象是否已经是中断状态,不会清楚状态标识

13.停止线程的最佳方式,异常法

14.不推荐使用stop方法暴力停止线程,该方法已过期,可能会出错

15.yield()方法是放弃当前的CPU资源,让其他线程去占用CPU时间片,有可能刚放弃,马上又获取时间片

16.setPriority()方法设置线程优先级,范围是1~10,不在该范围内将会抛异常

17.线程优先级具有继承性,比如A线程启动B线程,则B线程的优先级和A一样

18.线程具有一定的规则性,会尽量让优先级最高的线程先执行

19.线程优先级还具有随机性,即线程优先级高的不一定每一次都先执行,特别是级别相差不大时

20.当进程中不存在非守护(Deamon)线程了,则守护线程自动销毁,finally也不会执行(不能在守护线程中进行IO操作),典型的守护线程就是GC

二、对象及变量的并发方法

1.非线程安全问题存在于实例变量中,如果方法内部的私有变量,则不存在线程安全问题,因为方法内存是由虚拟机栈分配内存,而虚拟机栈是线程私有的

2.在试用synchronized锁对象时,如果多个线程访问多个对象,则JVM会创建多个锁

3.多个线程访问同一个对象才会是排队的

4.A线程持有object锁,B线程可以以异步的方式调用object非synchronized锁住的方法

5.A线程持有object锁,B线程调用object对象的synchronized方法是同步的

6.有一个线程获得了某对象锁,此时这个对象还没有释放,当其想要再次获取这个对象锁是可以获取的,如果不可重入的话就会死锁

7.当一个线程执行的代码出现异常时,其所持有的锁会自定释放

8.同步不具有继承性

9.锁非this对象可以提高效率,不与其他锁this同步方法争抢锁

10.使用synchronized(非this对象)同步代码块时,对象监视器必须是同一个对象,否则就是异步调用了

11.同步synchronized(class)代码块和synchronize static方法作用一样,都是锁住整个Class类的,无论外面new多少个对象都是同步的

12.可以通过锁代码块的方式来解决方法无线等待的问题

13.在多线程中只要出现互相等待对方释放锁就有可能出现死锁

14.volatile的主要作用是使变量在多个线程间可见,但不支持原子性(有计算值的情况下是非原子操作),而是对数据的读写强制影响到主内存

15.线程安全包含原子性和可见性两个方面,java同步机制都是围绕这两个方面来确保线程安全的

三、线程间通信

1.方法wait()的作用是使当前线程退出当前锁进行等待,调用wait()方法前必须获得该对象的对象别的锁,否则会抛出异常

2.notify()也要在同步方法或同步代码块中调用,即调用前也必须获得该对象的对象级别的锁,该方法执行后并不会立即释放锁

3.如果发出notify()操作时没有处于阻塞状态的线程,那么该命令会被忽略

4.wait()方法退出当前对象锁,进入等待状态,知道被notify()唤醒,否则一直处于等待状态

5.notify(0方法会随机从等待队列中唤醒一个线程,使它成为可运行状态

6.notifyAll()可以使所有处于等待队列中等待同一个共享资源的全部线程编程可运行状态,优先级最高的优先执行,也有可能随机执行,取决于JVM的实现

7.当方法wait()被执行后,锁被自动释放,但执行完notify()方法,锁却不自动释放,必须执行完notify()方法所在同步代码块或同步方法才会释放

8.在执行同步代码块的过程中,遇到异常而导致终止,锁也会被释放

9.join()可以使主线程等待子线程执行完毕后在执行,主线程的等待是调用的wait()方法实现的

10.join()方法与interrupt()方法如果彼此遇到会抛异常

11.join()的功能在内部是调用wait来实现的,会释放锁,sleep()方法不释放锁

12.Threadlocal解决的是变量在不同线程间的隔离性,也就是不同线程拥有自己的值,不同线程的值是可以放入Threadlocal类中进行保护的

13.使用InheritableThreadLocal可以在子线程中取得父线程继承下来的值

14.如果子线程在取得值的同时,主线程将InheritableThreadLocal中的值进行更改,那么子线程取到的值还是旧值

四、Lock的使用

1.ReentrantLock可以实现和synchronized关键字一样的效果,使线程同步

2.使用Condition实现等待/通知,Object中国的wait()方法相当于Condition的await(),Object的notify()方法相当于Condition的signal()方法

3.公平锁表示线程获取锁的顺序是按照线程枷锁的顺序来分配的

4.非公平锁是一种获取锁的抢占机制,是随机获得锁的

5.int getHoldCount()的作用是查询当前线程保持锁定的个数

6.int getQueueLength()的作用是返回正等待获取此锁定的线程估计数

7.int getWaitQueueLength(Condition condition)的作用是返回等待与此锁定相关的给定条件Condition的线程估计数 

8.读写锁ReentrantReadWriterLock可以提升程序效率(读读共享,写写互斥,读写互斥,写读互斥)














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值