java线程锁的状态_Java 对象锁-synchronized()与线程的状态与生命周期与守护进程

synchronized(someObject){

//对象锁

}

一、对象锁 someObject 的使用说明:

1、对象锁的返还。

当synchronize()语句执行完成。

当synchronize()语句执行出现异常。

当线程调用了wait()方法。

2、使用对象锁保护的数据都必须是私有的。

也就是说someObject 变量必须是private

3、对象锁具有可重入性。

一个线程在已经获得对象锁的情况下,可以再次请求获得对象锁。

二、线程的生命周期

f0a494dd74981a37364c224ff98fdf69.png

线程run()方法结束之后,这个线程就是死的了。可能会被回收了。

线程周期以及线程转换可以参考博文

jvm 内幕报文参考

这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。run() 返回时,被处理未捕获异常,原生线程将确认由于它的结束是否要终止 JVM 进程(比如这个线程是最后一个非守护线程)。当线程结束时,会释放原生线程和 Java 线程的所有资源。

三、守护进程

现在理解守护进程就是 不影响主线程停止的线程。即使守护进程一直在执行,但是主进程停止了,并且jvm程序里面只有守护进程,那么jvm 将会退出。如下就是例子:

public class DaemonTest {

public static void main(String[] args) {

new WorkerThread().start();

try {

Thread.sleep(7500);

} catch (InterruptedException e) {

// handle here exception

}

System.out.println("Main Thread ending") ;

}}class WorkerThread extends Thread {

public WorkerThread() {

// When false, (i.e. when it's a user thread),

// the Worker thread continues to run.

// When true, (i.e. when it's a daemon thread),

// the Worker thread terminates when the main

// thread terminates.

setDaemon(true);

}

public void run() {

int count = 0;

while (true) {

System.out.println("Hello from Worker "+count++);

try {

sleep(5000);

} catch (InterruptedException e) {

// handle exception here

}

}

}}

运行结果为:

Hello from Worker 0

Hello from Worker 1

Main Thread ending

当守护进程打印了第一行的时候,

睡了5秒,

接下来醒了,打印第二行。

接着又睡了

主线程也睡了。

总结来看,就是守护进程其实不受主进程死活的影响。只要JVM活着,不过调用该守护进程的主进程死活,守护进程都可以运行,但是如果JVM死了,那守护进程也挂了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java核心知识点整理 1.Java中没有多继承,而是用接口来代替多继承 2.运行一个已经编译的程序时,Java解释器总是从指定类的main方法中的代码开始执行,因此,执行代码中必须有一个main函数。 3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六,里面有大量的学习资料可以下载。 4.强制类型转换: int nx = (int) x; // (语法:用圆括号将目标类型括起来,后面跟上要转换的变量); 5.Java不能为单独的方法,如main方法,定义局部常量,而只能为类定义常量,供该类的所有方法使用,所以,通常称之为类常量。如: class UsersConstants{ 2public static final double g = 32; public static final double main(String[] args){ System.out.println(g); } } 注意:常量定义于main方法的外边,而且必须有关键字 static final; 6.字符串的子串: String str = hello”“; String str1 = str.substring(0,4); //输出hell 7.不要用==运算符来测试两个字符串是否相等,该运算符只能判断两个字符串是否存在同一个位置。 用equals. String str = “hello”; str.equals(”hell”); // return false; 8.对象的行为、状态、标识 9.面向过程与OOP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值