关于javamonitorlock的信息

今天给各位分享javamonitorlock的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、java synchronized 同步方法里的方法会同步吗2、Java线程状态中BLOCKED跟WAITING有什么区别3、java启用另外一个线程设置无超时状态4、Java Thread BLOCKED和WAITING两种状态的区别5、java线程同步的问题,究竟线程在什么时候释放锁

java synchronized 同步方法里的方法会同步吗

会同步,而且这个关键字能保证内存一致性。

要注意的是,synchronized是对什么对象进行加锁和同步?这个要分清楚:

public void synchronized foo(){

}//这里的synchronized是对本object的monitor/lock进行加锁

Object o = new Object(); synchronized(o)//这是对对象o的锁进行加锁。

关于javamonitorlock的信息

Java线程状态中BLOCKED跟WAITING有什么区别

BLOCKED状态

线程处于BLOCKED状态的场景。

当前线程在等待一个monitor lock,比如等待执行synchronized代码块或者使用synchronized标记的方法。

在synchronized块中循环调用Object类型的wait方法,如下是样例

synchronized(this)

{

while (flag)

{

obj.wait();

}

// some other code

}

WAITING状态

线程处于WAITING状态的场景。

调用Object对象的wait方法,但没有指定超时值。

调用Thread对象的join方法,但没有指定超时值。

调用LockSupport对象的park方法。

提到WAITING状态,顺便提一下TIMED_WAITING状态的场景。

TIMED_WAITING状态

线程处于TIMED_WAITING状态的场景。

调用Thread.sleep方法。

调用Object对象的wait方法,指定超时值。

调用Thread对象的join方法,指定超时值。

调用LockSupport对象的parkNanos方法。

调用LockSupport对象的parkUntil方法。

java启用另外一个线程设置无超时状态

Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误。

关于线程生命周期的不同状态,在Java 5以后,线程状态被明确定义在其公共内部枚举类型java.lang.Thread.State中,分别是:

新建(NEW),表示线程被创建出来还没真正启动的状态,可以认为它是个Java内部状态。

就绪(RUNNABLE),表示该线程已经在JVM中执行,当然由于执行需要计算资源,它可能是正在运行,也可能还在等待系统分配给它CPU片段,在就绪队列里面排队。 在其他一些分析中,会额外区分一种状态RUNNING,但是从Java API的角度,并不能表示出来。

阻塞(BLOCKED),这个状态和我们前面两讲介绍的同步非常相关,阻塞表示线程在等待Monitor lock。比如,线程试图通过synchronized去获取某个锁,但是其他线程已经独占了,那么当前线程就会处于阻塞状态。

等待(WAITING),表示正在等待其他线程采取某些操作。一个常见的场景是类似生产者消费者模式,发现任务条件尚未满足,就让当前消费者线程等待(wait),另外的生产者线程去准备任务数据,然后通过类似notify等动作,通知消费线程可以继续工作了。Thread.join()也会令线程进入等待状态。

计时等待(TIMED_WAIT),其进入条件和等待状态类似,但是调用的是存在超时条件的方法,比如wait或join等方法的指定超时版本,如下面示例:

public final native void wait(long timeout) throws InterruptedException;

终止(TERMINATED),不管是意外退出还是正常执行结束,线程已经完成使命,终止运行,也有人把这个状态叫作死亡。

在第二次调用start()方法的时候,线程可能处于终止或者其他(非NEW)状态,但是不论如何,都是不可以再次启动的。

考点分析

今天的问题可以算是个常见的面试热身题目,前面的给出的典型回答,算是对基本状态和简单流转的一个介绍,如果觉得还不够直观,我在下面分析会对比一个状态图进行介绍。总的来说,理解线程对于我们日常开发或者诊断分析,都是不可或缺的基础。

面试官可能会以此为契机,从各种不同角度考察你对线程的掌握:

相对理论一些的面试官可以会问你线程到底是什么以及Java底层实现方式。

线程状态的切换,以及和锁等并发工具类的互动。

线程编程时容易踩的坑与建议等。

可以看出,仅仅是一个线程,就有非常多的内容需要掌握。我们选择重点内容,开始进入详细分析。

知识扩展

首先,我们来整体看一下线程是什么?

从操作系统的角度,可以简单认为,线程是系统调度的最小单元,一个进程可以包含多个线程,作为任务的真正运作者,有自己的栈(Stack)、寄存器(Register)、本地存储(Thread Local)等,但是会和进程内其他线程共享文件描述符、虚拟地址空间等。

在具体实现中,线程还分为内核线程、用户线程,Java的线程实现其实是与虚拟机相关的。对于我们最熟悉的Sun/Oracle JDK,其线程也经历了一个演进过程,基本上在Java 1.2之后,JDK已经抛弃了所谓的Green Thread,也就是用户调度的线程,现在的模型是一对一映射到操作系统内核线程。

如果我们来看Thread的源码,你会发现其基本操作逻辑大都是以JNI形式调用的本地代码。

Java Thread BLOCKED和WAITING两种状态的区别

一、线程5种状态

新建状态(New) 新创建了一个线程对象。

就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

运行状态(Running) 就绪状态的线程获取了CPU,执行程序代码。

阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

二、Jstack中常见的线程状态

应用程序启动后,我们对系统运行状况的观测大部分情况下是通过运行日志。但是若某一天发现,日志中记录的行为与预想的不一致,此时需要进一步的系统监控该怎么办,Jstack是常用的排查工具,它能输出在某一个时间,Java进程中所有线程的状态,很多时候这些状态信息能给我们的排查工作带来有用的线索。 

Jstack的输出中,Java线程状态主要是以下几种:

RUNNABLE 线程运行中或I/O等待

BLOCKED 线程在等待monitor锁(synchronized关键字)

TIMED_WAITING 线程在等待唤醒,但设置了时限

WAITING 线程在无限等待唤醒

1) 让线程一直处于RUNNABLE

public static void runnable() {

        long i = 0;

        while (true) {

            i++;

        }

    }

2) 让线程一直处于BLOCKED

public static void blocked() {

        final Object lock = new Object();

        new Thread() {

            public void run() {

                synchronized (lock) {

                    System.out.println(“i got lock, but don’t release”);

                    try {

                        Thread.sleep(1000L * 1000);

                    } catch (InterruptedException e) {

                    }

                }

            }

        }.start();

        try { Thread.sleep(100); } catch (InterruptedException e) {}

        synchronized (lock) {

            try {

                Thread.sleep(30 * 1000);

            } catch (InterruptedException e) {

            }

        }

    }

主线程sleep,先让另外一个线程拿到lock,并长期持有lock(sleep会持有锁,wait不会)。此时主线程会BLOCK住等待lock被释放,此时jstack的输出可以看到main线程状态是BLOCKED。这里要注意的是只有synchronized这种方式的锁(monitor锁)才会让线程出现BLOCKED状态,等待ReentrantLock则不会。

3) 让线程处于TIMED_WAITING状态

public static void timedWaiting() {

        final Object lock = new Object();

        synchronized (lock) {

            try {

                lock.wait(30 * 1000);

            } catch (InterruptedException e) {

            }

        }

    }

4)让线程处于WAITING状态

public static void waiting() {

        final Object lock = new Object();

        synchronized (lock) {

            try {

                lock.wait();

            } catch (InterruptedException e) {

            }

        }

    }

无超时的等待,必须等待lock.notify()或lock.notifyAll()或接收到interrupt信号才能退出等待状态。

java线程同步的问题,究竟线程在什么时候释放锁

可以肯定的说,执行完同步代码块 立即释放 而与run方法没有关系

你这个结果应该是随机的

f()执行完释放this锁,被哪个线程拿到是随机的

关于javamonitorlock和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 00:39:27
下一篇 2024年4月1日 00:44:37

相关推荐

  • 关于avrstudio6c语言的信息

    c语言的程序员们你们公司用的开发工具是什么呢? 学c语言可以用的软件推荐如下:TurboC是由美国Borland公司开发的一套C语言程序开发工具,Borland公司是一家专门从事软件开发、研制的大公司。 Code:Blocks是一个开放源码的全功能的跨平台C/C++集成开发环境。Code:Blocks是开放源码软件。Code:Blocks由纯粹的C++语言开…

    2024年5月23日
    4000
  • 关于java如何查找线程的信息

    kill-3生成的线程堆栈怎么查看 通过给JVM发送一个SIGQUIT信号,您可以得到一个线程堆。 threaddump文件就是文本文件,可以使用任何文本查看工具进行查看; 建议使用比较高效的工具,比如more, less 等。 “Full thread dump”是一个全局唯一的关键字,你可以在中间件和单机版本Java的线程堆栈信息的输出日志中找到它(比如…

    2024年5月23日
    3600
  • 关于javasocketreader的信息

    用JAVA编写一个socket通信程序。 1、java编程对于Socket之间的通信过程如下:服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。 2、服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞。 此时,如果客户端有一个socket连接到服务端,那…

    2024年5月23日
    7400
  • 关于javapitfallspdf的信息

    怎么用java动态生成pdf文档 1、首先,您需要在 Java 程序中添加 Spire.Xls.jar 文件作为依赖项。您可以从这个链接下载 JAR 文件;如果您使用 Maven,则可以通过在 pom.xml 文件中添加以下代码导入 JAR 文件。 2、iText是着名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通…

    2024年5月23日
    3800
  • 关于pythonexcel打印设置字体的信息

    如何使用python更改excel表中的字体属性 字体,背景,边框等的颜色都可以通过三种方式设置:索引,aRGB或主题。 索引颜色是旧版实现,颜色本身取决于工作薄或应用程序默认提供的索引。主题颜色可用于互补色,但也取决于工作薄中存在的主题,因此,建议使用RGB颜色。 有着一定的参考价值,有需要的朋友可以参考一下可使用的第三方库python中处理excel表格…

    2024年5月23日
    4200
  • 关于linuxjpeg下载的信息

    请问怎么用grub2直接引导win10,本人Linux新手 第一步,当然是下载linux ubuntu1x的镜像了,这个小伙伴可以百度,去正规的网站现在,这里,我先提供一个站点:mirrors.xmu.edu.cn,厦门大学的信息与网络中心。里面有很多linux版本。有Deepin CenOS ubuntu什么什么的。 第一步:\x0d\x0a当然是下载Ub…

    2024年5月23日
    4700
  • 关于excel2013vc的信息

    如何利用VC++自动生成Excel表格 1、首先,我们需要点击文件菜单栏按钮。然后,我们点击生成EXE按钮。接下来,我们点击保存路径。然后,我们输入我们想要保存的文件名。最后,我们点击确定按钮。然后,我们便可以看到,在桌面生成了Excel表格了。 2、在主对话框中加入一个按钮 ID IDC_EXCELTEST Caption Test Excel 双击该按钮…

    2024年5月23日
    4700
  • 关于2t硬盘linux分区的信息

    linux硬盘2TB限制问题 1、Linux中进行磁盘分区一般是用fdisk这个命令,但是fdisk命令无法支持大于2TB以上的分区,而parted命令却是用于2TB以上大小的磁盘分区的工具。 2、asm无法识别2t磁盘是因为在分区的时候造成的,所以asm和linux都会有这个2T的限制。磁盘分区主要有MBR和GPT两种方式,发生2T限制的正是这个MBR方式…

    2024年5月23日
    7800
  • 关于linux下载geneontology的信息

    下载GO/KEGG某一pathway的genelist 功能(GO)或者通路(Pathway)富集分析时,都会涉及到 Background; 做分析时,分析工具会提供一些数据供使用者选择或者使用自定义的gene list。 clusterProfiler是一个功能强大的R包,同时支持GO和KEGG的富集分析,而且可视化功能非常的优秀,本章主要介绍利用这个R包…

    2024年5月23日
    4400
  • 关于linux下的mnt目录的信息

    Linux目录结构 总体而言,Linux系统的文件系统由块设备、分区、文件系统、目录结构、文件和元数据以及挂载点等组成。这种组织结构和层次关系提供了对文件和目录的有效管理和访问机制。 根目录和家目录均只是一种linux文件挂载点,linux采用树状发展目录结构根目录就是第一级,家目录与根目录看起来只是一个一级目录和二级目录的关系,实际上差别很大。 首先,打开…

    2024年5月23日
    5000

发表回复

登录后才能评论



关注微信