Java多线程与高并发学习(一)

写在开头 , 希望通过系统的学习彻底掌握多线程与高并发 。 也希望通过分享跟大家共同进步 , 都能进入自己理想中的公司 。
java虚拟机管理的内存主要包括以下几个区域
由线程共享的数据区: 方法区 和 堆
线程隔离的区域: 虚拟机栈 本地方法栈 程序计数器
程序计数器:占用较小的内存 可以看作当前线程的执行字节码的信号指示器 ,由于java虚拟机的多个线程是通过轮流切换并分配处理执行时间的方式实现的 。 因此每个独立的线程都有一个独立的线程私有程序计数器 。
虚拟机栈:虚拟机栈也是线程私有的 。 它的生命周期与线程相同 , 每个线程执行时都会创建一个栈帧 , 用于存储线程的局部变量表 , 操作数栈 , 动态链接 , 方法出口等 , 一个线程的生命周期就对应着一个栈帧的入栈出栈的过程 。
本地方法栈: 调用native 方法服务的 。 调用其他语言的本地类库 。
java 堆:java虚拟机管理的内存中最大的一块 , java堆是所有线程共享的 。 在虚拟机启动的时候创建 , 在内存区域的唯一目的就是存放对象实例 。 java堆是垃圾收集器管理的主要区域 , 很多时候也叫做GC堆 ,从内存回收角度来看 , 由于现在收集器基本都采用分代收集算法 , 所以java堆还可以细分为新生代和老年代 。
方法区:各个线程内存共享 , 它用于存储已被虚拟机加载的类信息 , 常量 , 静态常量; 运行时常量池是方法区的一部分 , class文件中除了有类的版本 , 字段 , 方法 , 接口 , 还有一项信息是常量池
多线程的6种状态:在Thread.class中定义了线程的各种状态
public enum State {// 新建NEW,//可运行运行 ready 可运行 但是没有cpu执行权RUNNABLE,// 阻塞 获取锁失败 synchronized方法 块BLOCKED,// 无限等待 需要被唤醒 wait join LockSupport.park()WAITING,// 有限等待 超时之后 可以自助进入runnable状态TIMED_WAITING,// 结束 run执行完成TERMINATED;}
Java多线程与高并发学习(一)文章插图
线程流转状态变化
start() 方法
线程不能被start二次 当线程第一次被new的时候 threadStatus 状态是0 相当于NEW状态 再次被启动会抛出 new IllegalThreadStateException异常
public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionality added* to this method in the future may have to also be added to the VM.** A zero status value corresponds to state "NEW".*///判断线程状态 如果不为0 抛出异常if (threadStatus != 0)throw new IllegalThreadStateException();/* Notify the group that this thread is about to be started* so that it can be added to the group's list of threads* and the group's unstarted count can be decremented. */group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}} start() 和 run()方法区别
Runable run()只是线程对业务逻辑的一个抽象接口 start()里面 start0()会调用 C++的本地类库 调用run方法
Thread 构造方法
public Thread() {init(null, null, "Thread-" + nextThreadNum(), 0);}private void init(ThreadGroup g, Runnable target, String name,long stackSize) {init(g, target, name, stackSize, null);}public Thread(ThreadGroup group, Runnable target, String name,long stackSize) {init(group, target, name, stackSize);}