首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Thread.start()方法在哪个对象上持有锁?

Thread.start()方法在调用该方法的Thread对象上持有锁。

在Java中,每个对象都有一个内部锁(也称为监视器锁或互斥锁),用于实现对象的同步。当一个线程调用一个对象的synchronized方法时,它必须先获得该对象的锁才能执行方法的代码。如果另一个线程已经持有该对象的锁,那么调用线程将被阻塞,直到锁被释放。

在调用Thread.start()方法时,它会启动一个新的线程,并在新线程上执行该线程对象的run()方法。在执行run()方法之前,start()方法会获取该线程对象的锁。这是为了确保在新线程中执行run()方法之前,不会有其他线程同时调用该线程对象的其他方法。

因此,可以说Thread.start()方法在调用该方法的Thread对象上持有锁。这个锁是用于控制线程的执行顺序和互斥访问共享资源的机制。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在 Visual Studio 2019 (16.5) 中查看托管线程正在等待的锁被哪个线程占用

Visual Studio 2019 (16.5) 版本更新中带来了一项很小很难注意到却非常实用的功能,查看哪一个托管线程正在持有 .NET 对象锁。...功能入口 这个功能没有新的入口,你可以在“调用堆栈” (Call Stack) 窗口,“并行堆栈” (Parallel Stacks) 窗口,以及“线程”窗口的位置列中查看哪个托管线程正在持有 .NET...对象锁。...打开调用堆栈窗口(在“调试 -> 窗口 -> 调用堆栈”),可以看到堆栈最顶端显示了正在等待锁,并且指出了线程对象。 ?...然后在线程窗口(在“调试 -> 窗口 -> 线程“)的位置列,鼠标移上去可以看到与堆栈中相同的信息。 ? 当然,我们的主线程实际上早已直接退出了,所以正在等待的锁将永远不会释放(除非进程退出)。

2.2K10

【Java】解决Java报错:IllegalMonitorStateException in Synchronization

IllegalMonitorStateException的常见触发场景 在使用同步代码块或方法时,IllegalMonitorStateException可能会在以下几种情况下触发: 在线程没有持有对象的监视器锁时调用...在线程没有持有对象的监视器锁时调用Object.notify()或Object.notifyAll()。 在非同步方法中调用上述方法。 3....(); } } 在同步方法waitForLock中调用lock.wait(),确保当前线程持有lock对象的监视器锁。...确保在持有监视器锁时调用等待和通知方法 在使用wait()、notify()和notifyAll()方法时,确保当前线程持有相应对象的监视器锁。 2....经过分析发现,问题出在多个线程在没有持有锁的情况下调用了wait()和notifyAll()方法。

14910
  • Java Review - 并发编程_LockSupport

    LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。...,然后当前线程被挂起,这是因为在默认情况下调用线程是不持有许可证的。 在其他线程调用 unpark(Thread thread)方法并且将当前线程作为参数时,调用park方法而被阻塞的线程会返回。...,由于在默认情况下子线程没有持有许可证,因而它会把自己挂起。...另外park方法还支持带有blocker参数的方法void park(Object blocker)方法,当线程在没有持有许可证的情况下调用park方法而被阻塞挂起时,这个blocker对象会被记录到该线程内部...在代码(1)处,如果当前线程不是队首或者当前锁已经被其他线程获取,则调用park方法挂起自己。

    40040

    LockSupport 工具类使用以及实现原理

    LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。...如下代码直接在main函数里面调用park方法,最终只会输出begin park!,然后当前线程被挂起,这是因为在默认情况下调用线程是不持有许可证的。...void park(Object blocker) park方法还支持带有blocker参数的方法 void park(Object blocker)方法,当线程在没有持有许可证的情况下调用park方法而被阻塞挂起时...在代码(1)处,如果当前线程不是队首或者当前锁已经被其他线程获取,则调用park方法挂起自己。...然后在代码(2)处判断,如果park方法是因为被中断而返回,则忽略中断,并且重置中断标志,做个标记,然后再次判断当前线程是不是队首元素或者当前锁是否已经被其他线程获取,如果是则继续调用park方法挂起自己

    2.1K10

    Java多线程学习(二)synchronized关键字(1)

    所以在上面的实例中,哪个线程先执行带synchronized关键字的方法,则哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。...本例中很显然是两个对象。 在本例中创建了两个HasSelfPrivateNum类对象,所以就产生了两个锁。...取得的锁都是对象锁,而不是把一段代码或方法当做锁。...如果多个线程访问的是同一个对象,哪个线程先执行带synchronized关键字的方法,则哪个线程就持有该方法,那么其他线程只能呈等待状态。...另外出现异常时,其锁持有的锁会自动释放。 七 同步不具有继承性 如果父类有一个带synchronized关键字的方法,子类继承并重写了这个方法。

    97640

    Effective JavaScript Item 51 在类数组对象上重用数组方法「建议收藏」

    Array.prototype对象上的标准方法被设计为也能够在其他对象上重用 – 即使不是继承自Array的对象。...在Web环境中,DOM的NodeList类型的实例也是类数组对象。 因此,对于它也能够使用以上的方式借助Array中的方法进行操作。 那么,到底什么才是”类数组对象”呢?实际上。...在全部Array提供的方法中,仅仅有一个是不可以被”类数组对象”使用的:Array.prototype.concat方法。 它尽管可以被”类数组对象”通过call方法进行调用。...可是它还会检查[[class]]的值(实际上就是对象的类型)。关于[[class]],在Item 40有提到过。 concat方法会推断传入的对象是否是一个真正的数组对象。假设是数组对象。...对Array上的方法进行重用,使之可以被用在”类数组对象”上。 不论什么对象都可以利用Array上的方法,仅仅要改方法满足了”类数组对象”的两条规则。

    89810

    Java 多线程中wait、notify、nptifyAll、yield、join、sleep的使用方法及区别

    在Java多线程编程中,会涉及到wait、notify、nptifyAll、yield、join、sleep线程间交互的方法,这些比较晦涩难懂,现在全面介绍下这些方法的使用方式。 1....2.使用说明 1) wait/wait(time) 与 notify/notifyAll wait、nofity、notifyAll都是操作synchronized锁持有对象的方法,wait表示当前锁对象开启...wait等待通知唤醒并交出锁,notify表示通知唤醒一个wait状态的对象锁,notifyAll表示通知唤醒全部wait的对象锁。...wait、nofity、notifyAll都是配合synchronized使用的,只有锁持有对象才能使用这些方法,否则会报错。...join(time)表示在设置时间内指定线程没有执行完,也结束阻塞,继续执行代码。 如下代码表示主线程调用了thread的join方法,形成阻塞,thread睡了2秒后,主线程继续执行。

    1K20

    聊聊挂起与唤醒线程LockSupport工具类

    void parkNanos(long nanos):阻塞当前线程,最长不超过nanos纳秒,返回条件在park()的基础上增加了超时返回。...JDK1.6中,增加了带有blocker参数的几个方法,blocker参数用来标识当前线程在等待的对象,用于问题排查和系统监控。...下面演示park()方法和unpark()方法的使用: 在thread线程中调用park()方法,默认情况下该线程是不持有许可证的,因此将会被阻塞挂起。...blocker参数,标识当前线程在等待的对象,当线程在没有持有许可证的情况下调用park方法而被阻塞挂起时,这个blocker对象会被记录到该线程内部。...JDK提供的demo 老传统了,摘一段JavaDoc上的使用案例: /** * 先进先出的锁,只有队列的首元素可以获取锁 */ class FIFOMutex { private final

    19741

    线程基础知识归纳

    线程有自己的堆栈和局部变量,但 线程之间没有单独的地址空间,所以可能一个线程出现问题,进而导致整个程序出现问题 2.线程的状态及其相互转换 初始(NEW):新创建了一个线程对象,但还没有调用start...阻塞(BLOCKED):线程阻塞于synchronized锁,等待获取synchronized锁的状态。...2.1创建线程的方式(上) 继承Thread,并重写父类的run方法 实现Runable接口,并实现run方法 实际开发中,选第2种:java只允许单继承 增加程序的健壮性,代码可以共享,代码跟数据独立...线程的挂起操作实质上就是使线程进入“非可执行”状态下,在这个状态下CPU不会分给线程 时间片,进入这个状态可以用来暂停一个线程的运行。...、放弃已经获得的锁、进入等待状态 notify() 随机唤醒一个在等待锁的线程 notifyAll() 唤醒所有在等待锁的线程,自行抢占cpu资源 被废弃的相关挂起Demo: /** * 挂起操作的Demo

    42120

    Python线程-线程的互斥

    一个 Lock 对象一次只能被一个线程持有,如果其他线程尝试获取该 Lock 对象时发现它已被持有,则它们会被阻塞,直到该 Lock 对象被释放。...release() 方法release() 方法是 Lock 类中用于释放锁的方法,它将锁的状态设置为未锁定,从而允许其他线程获取该锁。...在使用 Lock 类时,需要注意以下几点:尽量避免长时间持有锁对象。如果一个线程长时间持有锁对象,可能会导致其他线程被阻塞,从而影响程序的性能。...为了避免死锁,建议使用 with 语句来管理锁对象的获取和释放操作,从而保证锁对象在退出 with 代码块时一定会被释放。使用可重入锁。...在 Python 中,RLock 类就是一个可重入锁对象,它的使用方法和 Lock 类类似,但允许同一个线程多次获取该锁对象。

    64920

    Thread实现及方法

    在调用wait方法之前,线程必须获得该对象的对象锁,也就是说只能在同步方法或同步代码块中调用wait方法。...在执行wait方法后,当前线程锁会自动释放,当wait方法返回该线程与其他线程重新竞争获取锁。...,在调用前必须获得对象的对象锁。...在执行notify方法后,当前线程不会马上释放该对象的对象锁,wait状态的线程也不能马上获取该对象的对象锁,要等到执行notify方法的线程将任务执行完成后,也就是退出synchronized代码块后...在执行同步代码块的过程中,遇到异常而导致线程终止,锁也不会被释放; 2. 在执行同步代码块的过程中,执行了锁所属的对象的wait方法,这个线程会释放对象锁,而此线程对象会进入线程等待池中等待被唤醒。

    81541

    Java-线程

    妈妈:你先完成作业,才让你玩手机 小明:你先让我玩手机,我才完成作业 例子: A 线程先持有 o1 对象,才可以持有 o2 对象 B 线程先持有 o2 对象,才可以持有 o1 对象 package com.jwt.threaduse...如果flag 为T, 线程A 就会先得到/持有o1 对象锁, 然后尝试去获取o2 对象锁 //2. 如果线程A 得不到o2 对象锁,就会Blocked //3....如果flag 为F, 线程B 就会先得到/持有o2 对象锁, 然后尝试去获取o1 对象锁 //4....,不会释放锁 案例:上厕所,太困了,在坑位上眯了一会 2.线程执行同步代码块时,其他线程调用了该线程的 suspend() 方法将该线程挂起,该线程不会释放锁。...//3.哪个线程争夺到(获取)this对象锁, 就执行synchronized 代码块,执行完后, 会释放this对象锁 //4.争夺不到this对象锁

    44140

    【JAVA-Day76】Java线程解析:三态和五态

    通过了解线程的三态及其状态转换,我们可以更好地理解线程在不同情况下的行为,从而更有效地进行多线程编程。 二、什么是五态 五态则包括了三态的基础上,增加了等待和计时等待状态。...,处于新建状态 System.out.println("线程处于新建状态"); // 调用 start() 方法,将线程对象转变为运行状态 thread.start...通过大量实例,助你更好地理解线程状态在不同场景下的灵活应用。 1. 新建状态(New): 在多线程编程中,新建状态通常出现在创建线程对象后,但尚未调用 start() 方法启动线程的阶段。...线程从运行状态转变为等待状态通常是通过调用wait()方法来等待某些条件的发生。在这种情况下,线程会释放它所持有的锁,并进入等待状态,直到其他线程唤醒它。 线程如何从运行状态转变为计时等待状态?...在Java中,如何避免线程死锁? 要避免线程死锁,可以采取以下措施: 避免嵌套锁,即在持有一个锁的情况下再去申请另一个锁。

    6710

    深读 JDK 源码丨Java Thread

    Thread.start() 前调用)。...---- Thread 类源码中的关键方法 Thread.start():启动线程 调用 start() 时,会首先检查是否是首次启动此线程,也就是threadStatus == 0,如果 threadStatus...A 和 C 两个线程通过对象B来完成交互,而对象上的wait()方法和notify()/notifyAll()方法的关系就如同开关信号一样,用来完成等待方和通知方之间的交互工作。...这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。...Synchronized 和 ReentranLock 都是可重入锁,可在一定程度上避免死锁 独享锁/共享锁 独享锁是指该锁一次只能被一个县城持有,共享锁是指该锁可以被多个想成持有 Synchronized

    63110

    Java多线程编程

    同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。...+= value; } Java实例方法同步是同步在拥有该方法的对象上。...这样,每个实例其方法同步都同步在不同的对象上,即该方法所属的实例。只有一个线程能够在实例方法同步块中运行。如果有多个实例存在,那么一个线程一次可以在一个实例同步块中执行操作。一个实例一个线程。...一次只有一个线程能够在同步于同一个监视器对象的Java方法内执行。 下面两个例子都同步他们所调用的实例对象上,因此他们在同步的执行效果上是等效的。...2、一旦线程调用了wait()方法,它就释放了所持有的监视器对象上的锁。这将允许其他线程也可以调用wait()或者notify()。 3、为了避免丢失信号,必须把它们保存在信号类里。

    56020

    Java多线程

    4)不同的修饰位置 我们现在知道,synchronized锁住的是对象,也就是获取到了对象的锁,但处于不同的修饰位置,获取哪个对象的锁也是不一致的。...对象,我比较喜欢使用,因为class对象具有唯一性 修饰方法时: 成员方法:成员方法所在的类所创建出来的对象,也就是谁调用了这个方法,获取的就是谁的锁 静态方法:当前方法所在类的class对象,XXX.class...wait()、notify()、notifyAll()方法时,必须要持有锁。...而且唤醒还一定要持有相同对象的锁,也就是使用synchronized获取同样的对象的锁,并使用该对象进行唤醒其实很好理解,一个持有锁的线程,怎么可能会被没有持有同样锁的线程唤醒呢 3)生产者消费者模式...和1之间反复横跳,但实际上的结果,却大大出乎我所料 这个原因很好解释,因为wait方法有个特性,在摔倒就在哪里爬起来,然后继续向前走。

    63640
    领券