首页
学习
活动
专区
工具
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...对象。...打开调用堆栈窗口(“调试 -> 窗口 -> 调用堆栈”),可以看到堆栈最顶端显示了正在等待,并且指出了线程对象。 ?...然后在线程窗口(“调试 -> 窗口 -> 线程“)的位置列,鼠标移上去可以看到与堆栈中相同的信息。 ? 当然,我们的主线程实际早已直接退出了,所以正在等待的将永远不会释放(除非进程退出)。

2K10

Java Review - 并发编程_LockSupport

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

38440

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关键字的方法,子类继承并重写了这个方法

93840

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秒后,主线程继续执行。

90620

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

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

86410

聊聊挂起与唤醒线程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

14830

线程基础知识归纳

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

39120

Thread实现及方法

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

79441

Python线程-线程的互斥

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

62920

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对象

42140

深读 JDK 源码丨Java Thread

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

60710

Java多线程编程

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

54120

多线程笔记(六)synchronized 方法 和 synchronized 块

synchronized 方法 这个就是一个关键字,我们的方法加这个关键字,那么这个方法就被同步了 这个是的 这个方法的类 本身 public class qp implements Runnable...Thread thread1 = new Thread(qp,"需"); Thread thread2 = new Thread(qp,"uu"); thread.start...(); thread1.start(); thread2.start(); } } 以上的代码就是 ,将run方法里面的代码提取出来,另外写一个方法,在这个重新写...的方法上面加synchronized关键字,那么 现在线程就加锁了,买票的时候,不会出现负数的情况 synchronized 块 这个同步监视器 的值就是对哪个对象进行增删改查 那么这个参数就是哪个值...这个就是需要 变化的量,这个变化的量 就是需要增删改查的对象 public class ArrayL { public static void main(String[] args)

32020

Java多线程

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

62140

张三并发编程实践:掌握多线程技巧,打造高性能应用!

线程的状态线程执行过程中会经历不同的状态:新建(New):当用new关键字创建一个线程对象时,线程处于新建状态。此时,线程对象已经创建,但线程还没有开始执行。...Thread thread = new Thread();就绪(Runnable):当线程对象调用了start()方法后,线程进入可运行状态。此时,线程已经准备好执行,等待系统分配资源。...当一个线程试图访问被synchronized关键字修饰的同步代码块时,它需要获取。如果已经被其他线程持有,当前线程会被阻塞,等待被释放。...lock.wait();超时等待(Timed Waiting):线程等待状态的基础,设置了等待超时时间。...需要注意的是,yield() 方法并不保证一定会使当前线程立即停止执行。线程调度器可以自由决定是否立即调度其他线程。实际,yield() 方法的效果往往取决于具体的操作系统和 JVM 实现。

18310
领券