文档章节

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

Oscarfff
 Oscarfff
发布于 2015/05/04 10:18
字数 720
阅读 871
收藏 3
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死了,那守护进程也挂了。



© 著作权归作者所有

共有 人打赏支持
Oscarfff
粉丝 73
博文 815
码字总数 96913
作品 0
崇明
后端工程师
私信 提问
Java语言学习(十二):多线程

Java中给多线程编程提供了内置的支持,多线程是多任务的一种特别形式,它使用了更小的资源开销。这里需要知道两个术语及其关系:进程和线程。 进程:进程是系统进行资源分配和调度的一个独立...

海岸线的曙光
07/19
0
0
Java并发编程笔记之基础总结(二)

一.线程中断 Java 中线程中断是一种线程间协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是需要被中断的线程根据中断状态自行处理。   1.void interrupt() 方法:中断线...

狂小白
07/17
0
0
Java并发基础你需要知道的基础知识

多线程和并发编程是Java里面的核心内容,通常有以下一些概念需要重点掌握。 线程; 锁; 同步器; 并发容器和框架; Java并发工具类; 原子操作类; Executor框架(执行机制); 并发基础概念 ...

异步社区
05/30
0
0
Java 多线程编程核心技术 笔记

外练互斥,内修可见。 1:currentThread() 方法可返回代码正在被哪个线程调用的信息 使用方法:Thread.currentThread.getName() 2:isAlive() 功能是判断当前线程是否处于活动状态 使用方法:T...

西瓜1994
10/12
0
0
多线程编程学习一(Java多线程的基础).

一、进程和线程的概念 进程:一次程序的执行称为一个进程,每个 进程有独立的代码和数据空间,进程间切换的开销比较大,一个进程包含1—n个线程。进程是资源分享的最小单位。 线程:同一类线...

jmcui
2017/09/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MYSQL事务处理

INNODB 事务里,所有表引擎必须为INNODB,在非实务表上操作,不会警告,不会报错,但没有效果

关元
23分钟前
1
0
cmake 编译脚本

#!/bin/sh test -d build || mkdir -p build cd build cmake .. make

shzwork
41分钟前
2
0
从零开始实现Vue简单的Toast插件

概述: 在前端项目中,有时会需要通知、提示一些信息给用户,尤其是在后台系统中,操作的正确与否,都需要给与用户一些信息。 1. 实例 在Vue组件的methods内,调用如下代码 `this``.$toast({...

前端小攻略
46分钟前
1
0
yaf和yaconf

pecl install yafpecl install yaconf [yaf] yaf.environ = dev yaf.use_spl_autoload = On yaf.use_namespace = 1 [yaconf] yaconf.directory = /data/wwwroot/yaconf......

果树啊
46分钟前
0
0
day01:shell基础(shell基础、alias及重定向)

1、shell基础介绍: shell是一个命令解释器,用于用户与机器的交互: 也支持特定的语法(逻辑判断,循环): 每个用户都有自己特定的shell:Centos7的shell是bash(bourne agin shell): shel...

芬野de博客
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部