JAVA进阶-线程
线程基础1.并发和并行有什么区别并行多个任务在同一个CPU核上按细分的时间片轮流进行执行从逻辑上看哪些任务是同时执行的。并发多个处理器或多核处理器同时处理多个线程。并行的操作类似于两个人轮流使用同一台电脑。并发的操作类似于两个人各自有一台电脑。2.线程和进程的区别进程一个程序中有多个进程可以说程序是由多个进程组成的产物。线程一个进程中至少包含一个线程也可以说进程是由多个线程组成的产物。3.守护线程是什么守护线程是运行在后台的一种特殊的线程它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事情。Java虚拟机中的GC线程就是守护线程专门用来对没用的线程进行垃圾回收。4.创建线程有哪几种方式继承Tread类 重写run方法 其实际内部还是去实现了Runnable接口实现runnable接口实现Callable接口通过使用线程池进行创建5.runnable接口于Callable接口的区别runnable接口在进行实现后其对应的方法中没有返回值而Callable可以拿到返回值callable可以看作是runnable的补充。6.线程有哪些状态这个不确定5种 6种都有说五种的具体是新生、就绪、运行、阻塞、死亡说六种的具体是新生new 运行Runnable阻塞被IO锁或者同步锁阻塞 永久等待状态wait方法 timed_waiting (等待指定的时间重复唤醒 sleep join) 死亡补充join 方法是会使创建的线程进行顺序执行Semaphore 控制用一时间只有规定的线程运行7.Sleep方法与wait方法有什么区别类不同Sleep方法来自Tread类而wait方法是Object类从释放锁的角度执行了Sleep方法后线程不会释放锁需要设定睡眠时间来进行限制而执行wait方法后线程会释放锁而此时线程进入了等待池中如果需要将该线程唤醒就需要调用notify方法或者notifyAll方法进行唤醒重新进入就绪状态等待cpu时间片进行调度。用法不同sleep方法会设定具体的时间使自己自动恢复而wait方法需要notify方法或者notifyAll方法唤醒。8.notify方法和notifyAll方法的区别notifyAll方法会唤醒所有的线程。notify方法只能唤醒一个线程。notifyAll调用后会将全部线程由等待池全部放到对应的锁池中然后参与锁的竞争竞争成功后则继续执行如果不成功则继续留在锁池中等待锁的调用notify方法执行后是由虚拟机控制来随机分配的。9.线程run和start方法的区别run方法其实就是Java中普通的方法在线程中只是用于执行线程运行时的代码并且run方法可以重复调用。start方法就是用于启动线程的只能调用一次。10.在Java中怎么保证多线程运行安全使用安全类创建线程比如java.util.Concurrent 下的类使用自动锁 Synchronized使用手动锁 LockLock lock new ReentranLock();lock.lock();try{System.out.println(获得锁);}catch(Exception ex){}finally{System.out.println(释放锁);lock.unlock();}11.多线程中synchronized锁升级的原理是什么synchronized锁升级的原理在锁对象的对象头里面有一个threadId字段在第一次访问的时候threadId为空jvm让其持有偏向锁并将threadId设置为其线程Id再次进入时就会通过判断threadId是否和其线程Id一致如果一致则可以直接使用此对象如果不一致则升级偏向锁为轻量级锁通过自旋循环一定次数的方式去获得锁执行一定次数后如果还没有正常获得要使用的对象此时就会把锁从轻量级升级为重量级锁此过程就是synchronized锁升级的原理。升级的目的锁升级是为了减少锁带来的性能的消耗。12.什么是死锁有两个线程A、B 线程A持有A锁线程B持有B锁线程A在持有锁A的情况下想获取锁B线程B在持有线程锁B的情况下想获取锁A线程A和线程B都不想先释放持有的锁都处于等待对象释放锁此时就会导致阻塞而这种现象就会导致死锁。