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

为什么PrintStream.java中的println (Object x)方法从synchronized块外部调用String.valueOf()?

在PrintStream.java中的println(Object x)方法从synchronized块外部调用String.valueOf()的原因是为了提高性能和避免潜在的死锁问题。

首先,println(Object x)方法是用于将对象的字符串表示打印到输出流中。在这个方法中,我们需要将对象转换为字符串形式,然后再输出到流中。为了实现这个转换,可以使用String.valueOf()方法,它可以将任意类型的对象转换为字符串。

为了确保线程安全,PrintStream类中的方法通常会使用synchronized关键字来进行同步。然而,如果在synchronized块内部调用String.valueOf()方法,那么在转换过程中可能会发生其他线程的干扰,导致死锁问题。因此,为了避免这种情况,println(Object x)方法选择在synchronized块外部调用String.valueOf()方法。

此外,将String.valueOf()方法放在synchronized块外部还可以提高性能。由于String.valueOf()方法是一个静态方法,它不依赖于任何对象的状态,因此可以在不同的线程之间并发调用。如果将它放在synchronized块内部,那么每次调用println(Object x)方法时都会导致线程的串行执行,降低了并发性能。

综上所述,PrintStream.java中的println(Object x)方法从synchronized块外部调用String.valueOf()方法是为了避免死锁问题并提高性能。

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

相关·内容

  • JVM故障分析及性能优化实战(IV)——jstack生成Thread Dump日志线程状态

    (2)"Wait Set"里面的线程 当线程获得了Monitor,进入了临界区之后,如果发现线程继续运行条件没有满足,它则调用对象(通常是被synchronized对象)wait()方法,放弃Monitor...只有当别的线程在该对象上调用了 notify()或者notifyAll()方法,"Wait Set"队列线程才得到机会去竞争,但是只有一个线程获得对象Monitor,恢复到运行态。"...处于受阻塞状态某一线程正在等待监视器锁,以便进入一个同步/方法,或者在调用 Object.wait 之后再次进入同步/方法。...线程正在无期限地等待另一个线程来执行某一个特定操作,线程因为调用下面的方法之一而处于等待状态: 不带超时 Object.wait 方法,日志显示为 java.lang.Thread.State:...线程正在等待另一个线程来执行某一个特定操作,并设定了指定等待时间,线程因为调用下面的方法之一而处于定时等待状态: Thread.sleep 方法 指定超时值 Object.wait 方法 指定超时值

    2K52

    万字长文扫盲JUC基础

    TIMED_WAITTING,//超时等待 TERMINATED;//终结 } wait和sleep sleep是Thread静态方法,wait是Object方法,任何对象实例都能调用 sleep...不会释放锁,也不需要占用锁,wait会释放锁,调用前提是当前线程占有锁(代码要在synchronized) 在哪睡,在哪醒,均可被interrupted方法中断 并发和并行 并发同一瞬间,多个线程同时抢占一个...在资源类 判断 干活 通知 创建多个线程,调用资源类操作方法 防止虚假唤醒问题 复习Synchronized syschronized synchronized 是Java关键字,...是一种同步锁 可修饰 代码 方法 synchronized 关键字 可修饰一个代码快,称为同步代码,作用范围==>大括号之内,作用对象==>调用此代码对象 可修饰一个方法,称为同步方法...,作用范围==>整个方法,作用对象==>调用这个方法对象可修饰一个静态方法,作用范围==>整个静态方法,作用对象==>这个类所有对象 可修饰一个类,其作用范围是synchronized后面括号之内,

    19910

    JUC 多线程知识杂集

    monitor对象只有在同步或者方法才能调用wait/notify等方法) Lock是具体类(java.util.concurrent.locks.lock)是api层面的锁。...需要lock()和unlock()方法配合try/finally语句来完成。 3、等待是否可中断 synchronized不可中断,除非抛出异常或者正常运行完成。...ReentrantLock可中断,1.设置超时方法 tryLock(long timeout,TimeUnit unit);2.lockInterruptibly()放代码调用interrupt(...例如,应用程序主线程希望在负责启动框架服务线程已经启动所有框架服务之后执行。 2、如何用: CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。...其他线程调用countDown方法会将计数器减1(调用CountDown方法线程不会阻塞),当计数器值变为0时,因调用await方法被阻塞线程会被唤醒,继续执行。

    29820

    Java并发编程基础

    synchronized:对于 同步 实现使用了monitorenter和monitorexit指令,而 同步方法 则是依靠方法修饰符上ACC_SYNCHRONIZED来完成。...---- 等待/通知机制——wait和notify 指一个线程A调用了对象Owait()方法进入等待状态,而另一个线程B调用了对象Onotify()或者notifyAll()方法,线程A收到通知后对象...3.notify()或notifyAll()方法调用后,等待线程依旧不会wait()返回,需要调用notify()或notifAll()线程释放锁之后,等待线程才有机会wait()返回。...4.notify()方法将等待队列一个等待线程等待队列移到同步队列,而notifyAll()方法则是将等待队列中所有的线程全部移到同步队列,被移动线程状态由WAITING变为BLOCKED。...5.wait()方法返回前提是获得了调用对象锁。 ---- 等待/通知经典范式 包括 等待方(消费者)和 通知方(生产者)。 等待方遵循以下原则: 获取对象锁。

    19330

    Collections.synchronizedMap()、ConcurrentHashMap、Hashtable之间区别

    为什么要比较Hashtable、SynchronizedMap()、ConcurrentHashMap之间关系?因为常用HashMap是非线程安全,不能满足在多线程高并发场景下需求。...那么为什么说HashTable是线程不安全? 如何线程安全使用HashMap 了解了 HashMap 为什么线程不安全,那现在看看如何线程安全使用 HashMap。...来保证线程安全,比如下面的 get 方法和 put 方法: public synchronized V get(Object key) { // 省略实现 } public...synchronized V put(K key, V value) { // 省略实现 } 所以当一个线程访问 HashTable 同步方法时,其他线程如果也要访问同步方法,会被阻塞住...{ synchronized (mutex) {m.clear();} } 源码可以看出调用 synchronizedMap() 方法后会返回一个 SynchronizedMap

    1.1K40

    怎么一本正经地秀技

    使用了两种方式创建内部类对象,一种是用外部引用方式,另一种是调用方法创建,在execute()方法,this代表是创建在堆外部对象,而在内部类,使用this是分别引用内部类属性和外部属性...最后,可能大家会疑惑,为什么println输出会调用重写toString()方法呢? 别急,让我来一一分析一下。 直接看Java相关类源代码就可以分析出来了。...先来看下System.out.println和System.out.print源代码 public void println(Object x){ String s = String.valueOf...(x); synchronized (this) { print(s); newLine(); } public...void print(Object obj) { write(String.valueOf(obj)); } 可以看到,当要打印一个对象时,会自动调用String.valueOf()这个方法

    33100

    Java面试——锁

    在并发环境,每个线程在获取锁时会先查看此锁维护队列,如果为空,或者当前线程是等待队列第一个,就占有锁,否则就会加入到等待队列,以后会按照 FIFO 规则从队列取到自己。...也就是说,线程可以进入任何一个它已经拥有的锁,所同步代码synchronized 和 unlock 都是可重入锁。...//简单理解,就是方法1 是一个同步方法,里面包含了一个方法2 也是同步方法,但是当进入方法1后,也就获得了方法2锁,即可重入锁 public synchronized void method1(){...System.out.println("方法1 synchronized"); method2(); } public synchronized void method2(){ System.out.printf...("方法2 synchronized"); } 自旋锁:是指尝试获取锁线程不会立即阻塞,而是采用循环方式尝试获取锁,这样好处是减少了上下文切换消耗,确定是循环会消耗 CPU。

    46620

    技术汇总:第二章:JUC

    它是操作系统动态执行基本单元,在传统操作系统,进程既是基本分配单元,也是基本执行单元。 线程:通常在一个进程可以包含若干个线程,当然一个进程至少有一个线程,不然没有存在意义。...synchronized实现同步基础:Java每一个对象都可以作为锁。 具体表现为以下3种形式。 对于普通同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前类Class对象。...对于同步方法,锁是Synchonized括号里配置对象 当一个线程试图访问同步代码时,它首先必须得到锁,退出或抛出异常时必须释放锁。...* 其它线程调用countDown方法会将计数器减1(调用countDown方法线程不会阻塞),  * 当计数器值变为0时,因await方法阻塞线程会被唤醒,继续执行。...* 其它线程调用countDown方法会将计数器减1(调用countDown方法线程不会阻塞), * 当计数器值变为0时,因await方法阻塞线程会被唤醒,继续执行。

    28120

    灵魂拷问:你真的理解System.out.println()打印原理吗?

    因此,若需调用这些带static定义属性或者方法,无需创建对象就能直接通过“类名.成员名”来调用。...作为static定义out引用变量,它在类加载时就被初始化了,初始化后,会创建PrintStream对象对out赋值,之后便能调用PrintStream类定义方法。...每个有传参println方法里,其最后调用方法都是print()与newLine()。...值得注意一点,这些带有传参println方法当中,里面都是通过同步synchronized来修饰,这说明System.out.println其实是线程安全。...out被赋值对象地址后,就可以调用PrintStream各种public修饰方法里,其中就包括println()、print()这类打印信息方法,通过out.println(“xxxx”)即可将

    2.2K30

    万丈高楼平地起,爆肝21000字Java基础知识总结,收藏起来总有用得着时候

    每一个方法调用直至执行完成过程,就对应着一个栈帧在虚拟机栈入栈到出栈过程。...内部类编译后文件名为:"外部类名$内部类名.java"; 为什么内部类可以直接访问外部成员呢? 那是因为内部中都持有一个外部引用。...二、然而,当一个线程访问object一个synchronized(this)同步代码时,另一个线程仍然可以访问该objectsynchronized(this)同步代码。...二、然而,当一个线程访问object一个synchronized(this)同步代码时,另一个线程仍然可以访问该objectsynchronized(this)同步代码。...为什么操作线程方法定义在Object

    48111

    Java多线程学习

    线程等待:Objectwait()方法,导致当前线程等待,直到其他线程调用此对象 notify() 方法或 notifyAll() 唤醒方法。...这个两个唤醒方法也是Object方法,行为等价于调用 wait(0) 一样。 线程让步:Thread.yield() 方法,暂停当前正在执行线程对象,把执行机会让给相同或者更高优先级线程。...但有一点需要注意是notify()调用后,并不是马上就释放对象锁,而是在相应synchronized(){}语句执行结束,自动释放锁后,JVM会在wait()对象锁线程随机选取一线程,赋予其对象锁...它可以对类所有对象实例起作用。 除了方法前用synchronized关键字,synchronized关键字还可以用于方法某个区块,表示只对这个区块资源实行互斥访问。...继承类需要你显式指定它某个方法synchronized方法; 总结: synchronized关键字可以作为函数修饰符,也可作为函数内语句,也就是平时说同步方法和同步语句

    41220
    领券