并发基础

Posted yuefeng123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发基础相关的知识,希望对你有一定的参考价值。

1、程序计数器为什么是私有的 ?
    作用:在多线程环境的情况下,程序计数器用于记录当前线程执行的位置,从而当线程切换回来的时候能够知道该线程上次运行到哪儿了。
    所以,程序计数器私有主要是为了 线程切换后能恢复到正确的执行位置。
2、虚拟机栈和本地方法栈为什么是私有的?
    每个java方法执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。
    虚拟机栈为 虚拟机执行java方法(也就是字节码)服务,
    本地方法栈 虚拟机使用到的native方法服务
    所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。
3、一句话简单了解堆和方法区
    堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象(所有对象都在这里分配内存),
   方法区主要用于存放已被加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
4、说说sleep()和wait()区别和共同点?
     两者最主要的区别在于:sleep方法没有释放锁,而wait方法释放了锁。
     两者都可以暂停线程的执行
     wait通常被用于线程间交互/通信,sleep通用用于暂停执行
     wait方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify或者notifyAll方法。
sleep方法执行完成后,线程自动苏醒。或者可以使用wait(long timeout)超时后线程会自动苏醒
5、我们调用start()方法时会执行run()方法,为什么我们不能直接调用run方法?
    new一个Thread,线程处于新建状态,调用start()方法,线程将处于就绪状态,当分配到cpu时间片时,线程将处于运行状态。start()会执行线程的相应准备工作,
   然后自动执行run()方法,这是真正的多线程工作。 而直接执行run()方法,会把run方法当成一个main线程下的普通方法去执行。并不会在某个线程中执行它,所以这并不是多线程工作

总结:调用start方法可启动线程并使线程处于就绪状态,而run方法只是thread的一个普通方法调用,还是在主线程执行

 

以上是关于并发基础的主要内容,如果未能解决你的问题,请参考以下文章

synchronized学习

如何从设置中获取数据并发送到此片段

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

golang代码片段(摘抄)

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段