[TOC]前言分析线程是否安全,先对类的成员变量,类变量,局部变量进行考虑,如果变量会在各个线程之间共享,那么就得考虑线程安全问题了,如果变量A引用的是线程安全类的实例,并且只调用该线程安全类的一个方法,那么该变量A是线程安全的的。示例一Servlet运行在Tomcat环境下,只有一个实例,会被tomcat的多个线程共享,因此其中的成员变量都会存在共享问题。public class MySe...
[TOC]一、成员变量和静态变量是否线程安全?如果它们没有共享,则线程安全如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安全二、局部变量是否线程安全?局部变量是线程安全的但局部变量引用的对象则未必如果该对象没有逃离方法的作用范围,它是线程安全的如果该对象逃离方法的作用范围,需要考虑线程安全三、局部变量线程安...
[TOC]示例一程序运行结果为:1 2 或 2 1。@Slf4j(topic = "c.ThreadLockDemo01") public class ThreadLockDemo01 { public static void main(String[] args) { Number1 n1 = new Number1(); new...
[TOC]一、共享带来的问题通过下方示例来演示共享变量产生的问题两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次@Slf4j(topic = "c.Test01") public class Test01 { static int counter = 0; public static void main(String[] args) t...
[TOC]一、五种状态五种状态的划分主要是从操作系统的层面进行划分的1. 新建状态(New): 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随...
[TOC]一、概述Java提供了两种线程,守护线程和用户线程。用户线程:平常使用时所创建的普通线程,也叫非守护线程。守护线程(即 Daemon thread):一般是为工作线程服务的线程,当所有的用户线程结束,守护线程自动结束。二、作用JVM 中的垃圾回收线程就是典型的守护线程,当进程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。垃圾回收是一个一直需要运行的机制,但是当没...
[TOC]一、概述 中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。二、中断线程方法interrupt()描述:该方法用于中断Thread线程,此线程并非当前线程,而是调用interrupt()方法的实例所代表的线程,并不是强制关闭线程,而是将中断标记...
[TOC]一、常用方法方法名static功能说明注意start() 启动一个新线程,在新的线程运行run方法中的代码start方法只是让线程进入就绪,里面的代码不一定立刻运行(CUP的时间片还没有分给他)。每个线程对象的start方法只能调用一次,如果调用多次会出现IllegalThreadStateExceptionrun() 新线程启用后会调用的方法如果在构造Thread对象时传递了Ru...
[TOC]一、概念介绍方法区:是虚拟机中一块线程共享的内存区域,用于存储类信息、常量池、静态变量、编译后的字节码等。堆:是虚拟机中最大的一块线程共享的内存区域,堆是 Java 内存管理的核心区域,所有的对象实例和数组都在堆中分配内存。虚拟机栈:是线程私有的内存区域。虚拟机栈的内存空间是给线程使用的,每启动一个线程,虚拟机都为其分配一块栈内存空间,虚拟机栈中可以存在多个栈帧。栈帧:每个线程分配...