程序员应当知道的常识

JAVA学习网 2020-08-30 18:22:04

作为一个程序员。虽然是软件开发,但是软件开发说到底还是得和底层硬件交互。如果对硬件不了解,那就无法更深入的去学习。一个程序是如何运行的?数据又是如何从硬盘中被程序读取到?为什么会存在线程安全问题?怎样才能保证程序安全,同时又提高并发量?我个人认为以下基础知识点应该是每个初级程序员应该知道的常识。如果不知道这个那根本没法继续研究更加深入的底层知识。

程序的运行过程

 

 程序在磁盘中是一个个文件。当打开exe格式的文件的时候,文件就会以数据流的形式被加载到内存。这时候程序就会变成一个进程,一个进程会有多个线程。每个线程又会各自绑定自己的栈。线程通过cpu调度执行就可以完成一个个功能。cpu会读取程序中的一条条二进制指令进行处理,并返回到内存中。cpu中的pc寄存器就是存储执行的线程的内存地址,通过pc寄存器可以确保该执行哪条指令。Registers是存储pc寄存器存储的内存地址中的数据。ALU:逻辑运算单元,负责将数据进行运算得出结果。cache:缓存,会将ALU得到的结果放入缓存并写入内存。当这个结果一直没有改变的时候下一次获取该数据的时候可以直接从缓存中获取。极大的提升了运算效率。

线程安全

什么是线程?线程就是进程的最小调度单位。如果说360安全卫士是一个进程,那么里面的某个木马查杀功能就是一个线程。线程有两类:守护线程(Daemon)和用户线程(
User Thread)。gc线程就是一个守护线程,主线程就是一个用户线程。守护线程用于服务用户线程。当用户线程结束任务关闭的时候,jvm不管守护线程在不在都会自动退出。线程安全问题一定是发生在多线程的情况下。如果是单线程,那不存在并发问题。

现在程序基本上都是多线程。单线程效率低,而且很容易出现一个问题:线程阻塞导致接下来的任务没法执行。

多线程又分为单核多线程和多核多线程。

单核多线程:一个cpu内核执行多个线程。多个线程争夺cpu时间片,在一段时间内做某些事情,这就是并发。

多核多线程:多个cpu内核执行多个线程。因为比单核多了几个内核,虽然也是多线程争夺cpu时间片,但是确确实实是在同一个时间点在做几个事情。这就是并行!效率比一般并发都要快。同时现在大多数也是这种情况。微观上来看,多核多线程底层还是单核多线程。

多线程操作虽然效率高了,但是会存在一个安全隐患问题:多个线程对同一个对象做修改造成数据严重丢失。最经典的莫过于买票问题:很有可能出现几个线程对同一张车票做处理导致一个票被卖了多次。

针对线程安全问题就出现了锁这种东西。当多个线程对同一个对象操作时,只有获取到锁的单位才能对他进行修改。

java锁有四种 无锁,偏向锁,自旋锁,重锁。锁的升级过程不可逆。锁的降级只有一种可能,gc回收,所以降级无意义。

以上都是我的个人见解,图片素材借鉴马老师视频。如有疑问欢迎讨论!

 

阅读(2862) 评论(0)