【多线程核心技术】---拾遗增补

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38375620/article/details/79614705

线程状态

    new 

    至今尚未启动的线程处于这种状态

    runnable

    正在Java虚拟机中执行的线程处于这种状态

    blocked

    受阻塞并等待某个监视器锁的线程处于这种状态

    waiting

    无限期的等待另一个线程来执行某一特定操作的线程处于这种状态

    timed waiting

    等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态

扫描二维码关注公众号,回复: 2998889 查看本文章

    terminated

    已退出的线程处于这种状态


    new状态是线程实例化后从未执行start()方法时的状态,而runnable状态是线程进入运行的状态,terminated是线程被销毁时的状态。


    TIMED_WAITING

    线程状态TIMED_WAITING代表了线程执行Thread.sleep( )方法,呈等待状态,等待时间到达,继续向下运行。

    BLOCKED

    状态blocked状态出现在某一个线程在等待锁的时候。

    WAITING

    状态Waiting是线程执行了Object.wait( )方法后所处的状态。

线程组

  线程组的作用:可以批量管理线程或线程组对象,有效的对线程进行组织。

    线程对象关联线程组:一级关联

    就是父对象中有子对象,但并不再创建子孙对象。比如创建一个线程时,为了有效地对这些线程进行组织管理,通常情况下是创建一个线程组,然后再将部分线程归属到该组中,这样就可以对零散的线程对象进行有效的组织与规划。

    线程对象关联线程组:多级关联

    就是父对象中有子对象,字对象再创建子对象。

    线程组自动归属特性

    自动归属就是自动归到当前线程组中。


    JVM的根线程组就是system。

    调用线程组的interrupt()将组内中的所有正在运行的线程批量停止

SimpleDateFormat非线程安全

    类SimpleDateFormat主要负责日期的转换与格式化。ThreadLocal类能使线程绑定到指定的对象,使用该类可以解决多线程环境下的SimpleDateFormat类处理错误的问题。

线程中的异常处理

    UncaughtExceptionHandler类可以对多线程中的异常进行“捕获”。

    方法setUncaughtExceptionHandler()的作用是对指定的线程对象设置默认的异常处理器。

    在Thead类中还可以使用setDefaultUncaughtExceptionHandler()方法指定线程类的所有线程对象设置默认的异常处理器。

    打印“静态的异常处理”信息,则必须在public void UncaughtException(Thread t,Throwable  e)方法中加上super.UncaughtException( t  , e );代码。



以下来自:http://ifeve.com/javaconcurrency-interview-questions-base/


java并发面试题(一)基础

本文整理了常见的Java并发面试题,希望对大家面试有所帮助,欢迎大家互相交流。

多线程

  1. java中有几种方法可以实现一个线程?
  2. 如何停止一个正在运行的线程?
  3. notify()和notifyAll()有什么区别?
  4. sleep()和 wait()有什么区别?
  5. 什么是Daemon线程?它有什么意义?
  6. java如何实现多线程之间的通讯和协作?

  1. 什么是可重入锁(ReentrantLock)?
  2. 当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?
  3. synchronized和java.util.concurrent.locks.Lock的异同?
  4. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

并发框架

  1. SynchronizedMap和ConcurrentHashMap有什么区别?
  2. CopyOnWriteArrayList可以用于什么应用场景?

线程安全

  1. 什么叫线程安全?servlet是线程安全吗?
  2. 同步有几种实现方法?
  3. volatile有什么用?能否用一句话说明下volatile的应用场景?
  4. 请说明下java的内存模型及其工作流程。
  5. 为什么代码会重排序?

如何停止一个线程?
最好的办法是设置一个变量,在外面改变这个变量,然后线程每次运行的时候检查这个变量的值。
如果直接用stop方法容易引起死锁的问题,

  • 这里需要做些纠正,我不知道为什么很多人说stop会导致死锁,但这个说法实在是有问题。stop方法被弃用,并不是因为会导致死锁的缘故,事实上,调用stop后,被stop的线程会抛出一个ThreadDeath错误,如果这个时候线程持有锁的话,它会像遇到一般异常一样处理,并不会有死锁的问题发生。它被弃用的主要原因在于会导致对象状态不一致。而suspend和resume确实会导致死锁

1 通过创建Thread
2 条件变量
3 随机唤醒和唤醒全部
4 定时等待和在监视器上等待,不同范畴
5 守护线程,不需要上层逻辑介入的后台线程 ,比如GC
6 中断和 直接或间接访问对方实例

1 更高级的锁,附加更多特性
2 可进入非synchronized方法
3 后者具有更丰富的特性
4 乐观锁是假设我已经拿到锁,悲观所是我必须拿到锁,前者用CAS,后者用mutex

1 后者具有更高的并发
2 多读少写

1 在多线程调用情况下,依然表现正常
2 锁和volatile
3 保持可见性,在1写N读的情况下比较适合
4 太多了,我只知道一些
5 编译器旨在提升性能



乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
乐观锁,每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止
悲观锁是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
乐观锁可以使用volatile+CAS原语实现

悲观锁可以使用synchronize的以及Lock


1. java中有几种方法可以实现一个线程?
可以使用Runnable,Callable,Thread或者线程池
2. 如何停止一个正在运行的线程?
可以使用正在运行的线程,支持线程中断,那么可以使用线程中断的方法停止这个线程;通常是定义一个volatile的状态变量,在运行线程线程中读这个变量,其它线程中修改这个变量
3. notify()和notifyAll()有什么区别?
notify是随机唤醒一个等待某个资源的线程,进入就绪队列等待CPU的调度,notifyAll是唤醒所有的,进入就绪队列等待CPU调度
4.sleep()和 wait()有什么区别?
sleep方法是在指定的时间内让正在执行的线程暂停执行,但不会释放锁。

而wait方法是让当前线程等待,直到其他线程调用对象的notify或notifyAll方法。wait方法会释放掉锁,使别的线程有机会占用锁。这个就是典型的两个线程互相等待对方持有的资源以致死锁的原因

5.什么是Daemon线程?它有什么意义?
守护线程是后台线程,它通常属于低优先级的线程,守护用户线程,通常做一些垃圾清理的工作,比如GC。当所有的用户线程退出后,守护线程不会立即退出,还出执行一段时间,具体多少时间,有知道的告诉我。。。
6.java如何实现多线程之间的通讯和协作?

同步和互斥,资源互斥、协调竞争是要解决的因,同步是竞争协调的果。可以使用synchnized/notify/notifyAll以及Lock/Condition, CyclicBarrier/Semaphore/Countdownbatch。线程的join以及Future/FutureTask是为了解决多线程计算后的结果统计


ReentrantLock 和synchronized比较:
性能上:
synchronized在Java5.0性能大胜synchronized,Java 6中synchronized 略有胜出—-摘自《java并发编程实战》(13.4)
当时我说synchronized在今后的JVM(JIT)优化的可能性比ReentrantLock大,回来后我翻翻资料,发现在ReentrantLock 和synchronized还真有一些需要了解的知识,所以特别整理下发给大家。
1.为什么JUC框架出现LOCK?
ReentrantLock并不是替代synchronized的方法,而是当内置锁不适用时,作为一种可选的高级功能。
2.那么Synchronized有哪些缺点?
①. 只有一个condition与锁相关联,这个condition是什么?就是synchronized对针对的对象锁。
②. synchronized无法中断一个正在等待获得锁的线程,也即多线程竞争一个锁时,其余未得到锁的线程只能不停的尝试获得锁,而不能中断。这种情况对于大量的竞争线程会造成性能的下降等后果。
可见ReentrantLock 是对synchronized补充。
3.我们面对ReentrantLock和synchronized改如何选择?
Synchronized相比Lock,为许多开发人员所熟悉,并且简洁紧凑,如果现有程序已经使用了内置锁,那么尽量保持代码风格统一,尽量不引入Lock,避免两种机制混用,容易令人困惑,也容易发生错误。
在Synchronized无法满足需求的情况下,Lock可以作为一种高级工具,这些功能包括“可定时的、可轮询的与可中断的锁获取操作,公平队列,以及非块结构的锁”否则还是优先使用Synchronized。

最后,未来更可能提升Synchronized而不是Lock的性能,因为Synchronized是JVM的内置属性,他能执行一些优化,例如对线程封闭的锁对象的锁消除优化,通过增加锁的粒度来消除内置锁的同步,而如果基于类库的锁来实现这些功能,则可能性不大。—以上建议摘自《java并发编程实战》(13.4)


ReentrantLock和JMM

    • tsingxu
    • 03/21. 2013 11:07am

    1 ReentrantLock 相对于固有锁synchronized,同样是可重入的,在某些vm版本上提供了比固有锁更高的性能,提供了更丰富的锁特性,比如可中断的锁,可等待的锁,平等锁以及非块结构的加锁。从代码上尽量用固有锁,vm会对固有锁做一定的优化,并且代码可维护和稳定。只有在需要ReentrantLock的一些特性时,可以考虑用ReentrantLock实现。

    2 JVM的内存模型可简单理解为,有一块整个JVM共享的主内存,每个线程有自己的变量复本,线程持有的复本与主内存之间使用内部的数据协议,再具体可参考一些blog和周志明的深入理解JVM12章


猜你喜欢

转载自blog.csdn.net/qq_38375620/article/details/79614705