美文网首页
照本宣科的问题

照本宣科的问题

作者: IAmWhoAmI | 来源:发表于2018-05-06 15:13 被阅读9次

    3条你遵循的多线程最佳实践
      三条最佳实践我觉得大多数Java程序员都应该遵循:

    1.给你的线程起个有意义的名字。 
    2.避免锁定和缩小同步的范围 锁花费的代价高昂且上下文切换更耗费时间空间,试试最低限度的使用同步和锁,缩小临界区。
    3.多用同步类少用wait 和 notify首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编码操作,而用wait和notify很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护在后续的JDK中它们还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。
    4.多用并发集合少用同步集合 ,并发集合比同步集合的可扩展性更好,所以在并发编程时使用并发集合效果更好。
    

    如何避免死锁?
      Java多线程中的死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:
    互斥条件:一个资源每次只能被一个进程使用。
    请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
    循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

    避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。这篇教程有代码示例和避免死锁的讨论细节。

    Java内存模型是什么?
      Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:
    线程内的代码能够按先后顺序执行,这被称为程序次序规则。
    对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。
    前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。
    一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。
    一个线程的所有操作都会在线程终止之前,线程终止规则。
    一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。
    可传递性

    我强烈建议大家阅读《Java并发编程实践》第十六章来加深对Java内存模型的理解。

    你如何在Java中获取线程堆栈?
      对于不同的操作系统,有多种方法来获得Java进程的线程堆栈。当你获取线程堆栈时,JVM会把所有线程的状态存到日志文件或者输出到控制台。
    在Windows你可以使用Ctrl + Break组合键来获取线程堆栈,Linux下用kill -3命令。你也可以用jstack这个工具来获取,它对线程id进行操作,你可以用jps这个工具找到id。

    Java中活锁和死锁有什么区别?
      这是上题的扩展,活锁和死锁类似,不同之处在于处于活锁的线程或进程的状态是不断改变的,活锁可以认为是一种特殊的饥饿。一个现实的活锁例子是两个人在狭小的走廊碰到,两个人都试着避让对方好让彼此通过,但是因为避让的方向都一样导致最后谁都不能通过走廊。简单的说就是,活锁和死锁的主要区别是前者进程的状态可以改变但是却不能继续执行。

    相关文章

      网友评论

          本文标题:照本宣科的问题

          本文链接:https://www.haomeiwen.com/subject/ohoyrftx.html