21道并发编程口试题(4)

      运行(running)的线程执行Thread.sleep(long ms)或t.join()要领,可能发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()期待线程终止可能超时、可能I/O处理惩罚完毕时,线程从头转入可运行(runnable)状态。

  灭亡(dead):线程run()、main() 要领执行竣事,可能因异常退出了run()要领,则该线程竣事生命周期。灭亡的线程不行再次复活。

9.volatile要害字有什么用途,和Synchronize有什么区别

  volatile用途:

    volatile是一个轻量级的Synchronize,担保了共享变量的可见性,可以或许防备脏读,被volatile要害字修饰的变量,假如值产生了改变,其他线程立即可见

  区别:

    (1)volatile只能浸染于变量,利用范畴较小。synchronized可以用在变量、要领、类、同步代码块等,利用范畴较量广。
    (2)volatile只能担保可见性和有序性,不能担保原子性。而可见性、有序性、原子性synchronized都可以包证。
    (3)volatile不会造成线程阻塞。synchronized大概会造成线程阻塞。

  什么是脏读,为什么产生脏读

    脏读是指当一个事务正在会见数据,而且对数据举办了修改。而这种修改还没有提交到数据库中,这时,别的一个事务也会见了这个数据,然后利用了这个数据。

10.先行产生原则

  10.1 措施序次原则:

    在一个线程内,凭据代码的顺序,书写在前面的代码优先于书写后头的代码;

  10.2 管程锁定法则:

    一个unlock操纵先行产生于后头对同一个锁的lock操纵,留意是同一个锁;

  10.3 volatile原则:

    对付一个volatile变量的写操纵先行产生于后头对变量的读操纵;

  10.4 线程启动原则:

    Thread工具的start()要领优先于此线程的每一个行动;

  10.5 线程终止原则:

    线程中所有的操纵都优先产生于此线程的每一个行动;

  10.6 工具间断原则:

    工具的interrupt()要领的挪用优先产生于被间断线程的代码监测间断事件的产生;先间断再检测;

  10.7 工具终结原则:

    一个工具的初始化(结构函数执行完毕)完成优先产生于它的finalize()要领的开始;

  10.8 通报性

    假如操纵A先行产生于操纵B,而操纵B又先行产生于操纵C,则可以得出操纵A先行产生于操纵C;

11.并发编程线程安详三要素

  11.1 原子性(Synchronized, Lock)

    即一个操纵可能多个操纵 要么全部执行而且执行的进程不会被任何因素打断,要么就都不执行。

    在Java中,根基数据范例的变量的读取和赋值操纵是原子性操纵,即这些操纵是不行被间断的,要么执行,要么不执行。

  11.2 有序性(Volatile,Synchronized, Lock)

    即措施执行的顺序凭据代码的先后顺序执行。

    在Java内存模子中,答允编译器和处理惩罚器对指令举办重排序,可是重排序进程不会影响到单线程措施的执行,却会影响到多线程并发执行的正确性。

  11.3 可见性(Volatile,Synchronized,Lock)

    指当多个线程会见同一个变量时,一个线程修改了这个变量的值,其他线程可以或许当即看获得修改的值。

    当一个共享变量被volatile修饰时,它会担保修改的值会当即被更新到主存,当有其他线程需要读取共享变量时,它会去内存中读取新值。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdjff.html