synchronized(someObject){
//对象锁
}
一、对象锁 someObject 的使用说明:
1、对象锁的返还。
当synchronize()语句执行完成。
当synchronize()语句执行出现异常。
当线程调用了wait()方法。
2、使用对象锁保护的数据都必须是私有的。
也就是说someObject 变量必须是private
3、对象锁具有可重入性。
一个线程在已经获得对象锁的情况下,可以再次请求获得对象锁。
二、线程的生命周期
线程run()方法结束之后,这个线程就是死的了。可能会被回收了。
线程周期以及线程转换可以参考博文
http://blog.csdn.net/LonelyRoamer/article/details/7949969
jvm 内幕报文参考
http://www.importnew.com/17770.html
这里所说的线程指程序执行过程中的一个线程实体。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死了,那守护进程也挂了。
来源:oschina
链接:https://my.oschina.net/u/2308739/blog/410266