参考:https://blog.csdn.net/evankaka/article/details/44153709
作为一个非科班出身的互联网小白,在读netty的时候接触到了并发、线程等概念,读完只是囫囵吞枣了几分。承蒙正好有高手跟稍微讲了下:多个请求同时发来,线程并不会阻塞去接受这个请求,而是会等请求信息发送完毕后,再启用线程处理;进而扩展了下线程池的概念,核心线程数量,最大线程数量等。听完后顿时觉得自己之前的学习方法有问题,学习一个新的东西,应该首先要知道的是为什么要这么做,这么做的好处,接着才是具体如何实现,如果盲目的学习代码细节或者概念上的东西,只会是似懂非懂,绝不会有深入的理解。想要以后读这些知识点的时候不再似懂非懂,我决心要把java编程思想捡起来好好看看,把基础知识补起来。首先,就看进程和线程的概念吧!
![](https://img.haomeiwen.com/i10011589/fbc798555baaabea.png)
首先,计算机基本结构:cpu,存储器(主存,也就是内存,当然还有硬盘),输入设备,输出设备,主存的读取速度高于硬盘。
那么为什么会有进程的概念,这里提两点 1:cpu的处理速度非常快,为了充分利用cpu,可以让他同时处理多个进程,比如说在电脑上同时打开音乐播放器和视频播放器 2:进程是cpu资源分配的最小单位,在给进程分配内存地址空间的时候,用了虚拟内存地址的概念,这样是为了有序的管理真实的物理地址。
线程,则是对cpu超快处理速度的进一步利用,在cpu处理某个进程的时候,他可以进一步被用来处理该进程里面的多个线程。线程是cpu调度的最小单位,在单核cpu中,一个单核用来处理一个线程。同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC)
以上说的都很抽象:以我们自己写的一段System.out.println("Hello world")程序为例吧
1:程序启动运行main时候,java虚拟机启动一个进程;因为每当使用java命令执行一个类的时候,实际上都会启动一个jvm,每一个jvm实际在就是在操作系统中启动了一个进程。JVM 通过类加载器加载 class 文件里的字节码后,会通过解释器解释成汇编指令,最终再转译成 CPU 可以识别的机器指令.
2:主线程main在main()调用时候被创建,在java中所有的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源;在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。在 JVM 中所有的线程共享堆内存和方法区,而每个线程有自己独立的 Java 方法栈.当调用一个方法的时候, Java 虚拟机会在当前线程对应的方法栈中压入一个栈帧
3:java创建对象在内存里的空间位置:主类型是在堆栈,一般对象是在内存堆
4:下面是线程的5个状态,着重介绍下锁的概念;由于线程共享进程里面的资源、函数等,为了防止混乱,有时候一个资源只能被一个线程访问
4.1 synchronized锁:指定加锁对象:对给定对象加锁,进入同步代码前要获取给定对象的锁。
直接作用于实例方法:相当于给当前实例加锁,进入同步代码块前要获得当前实例的锁。
直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获取当前类的锁。
4.2 当在一个对象实例上调用了wait()方法后,当前线程就会在这个对象上等待。直到其他线程调用了这个对象的notify()方法或者notifyAll()方法
调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)
![](https://img.haomeiwen.com/i10011589/b94b711dd017182b.png)
***在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。
例:锁住一个方法: public synchronized void test()
***使用Object的wait/notify
在线程中调用 wait() 方法,将阻塞当前线程,直至等到其他线程调用了调用 notify() 方法或 notifyAll() 方法进行通知之后,当前线程才能从wait()方法出返回,继续执行下面的操作
网友评论