首页 > 编程语言 >神出鬼没java的println方法,导致的问题

神出鬼没java的println方法,导致的问题

时间:2023-02-10 23:34:39浏览次数:36  
标签:getI java int System 神出鬼没 num println public

迷幻问题一 没有println方法,主线程无法读变量



public class ThreadTest {
    public static void main(String[] args) {
        Num num = new Num(0);
        new Thread(()->{
            while (true){
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                num.setI(num.getI()+1);
            }
        }).start();

    //问题代码
//        while (true){
//            //System.out.println注释掉 就不能打印到3s了..为什么?
//            //System.out.println(num.getI());
//            if (num.getI()==3) {
//                System.out.println("到3s了!!!!");
//                break;
//            }
//        }

        //这是答案,因为println会拿到对象锁,主线程有时间观察num对象的值变化
        while (true){
            synchronized (num){
                if (num.getI()==3) {
                    System.out.println("到3s了!!!!");
                    break;
                }
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }




    private static class Num{
        private  int  i;

        public Num(int i) {
            this.i = i;
        }

        public int getI() {
            return i;
        }

        public void setI(int i) {
            this.i = i;
        }
    }


}

实际上这个问题是println不熟悉导致的,println 使用synchronized拿到了对象锁,也就是使用println的这个线程拿到对象的锁,所以可以读到对象的数据

public void println(String x) {
        if (getClass() == PrintStream.class) {
            writeln(String.valueOf(x));
        } else {
            synchronized (this) {
                print(x);
                newLine();
            }
        }
    }

标签:getI,java,int,System,神出鬼没,num,println,public
From: https://www.cnblogs.com/cfas/p/17110674.html

相关文章

  • Java学习之File类的删除功能
    publicbooleandelete()删除由此抽象路径名表示的文件或目录绝对路径和相对路径的区别绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件,例如:/Users/St......
  • 巨坑系列:Java Bean 转 Map 的那些坑
    一、背景有些业务场景下需要将JavaBean转成Map再使用。本以为很简单场景,但是坑很多。二、那些坑2.0测试对象importlombok.Data;importjava.util.Date;@......
  • 在java路径上找不到javax.servlet.http.HttpServlet
    1.将写好的网页代码导入Java中会发现index.jsp文件开头部分出现报错   2.错误提示是找不到java路径问题   3.在项目中鼠标右键进行找到BuildPath选项点击......
  • Java方法
    Java方法Java方法是语句的集合,他们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法再程序中被创建,在其他地方被引用设计方法的......
  • java反序列化基础
    前言:最近开始学习java的序列化与反序列化,现在从原生的序列化与反序列化开始,小小的记录一下参考文章:https://blog.csdn.net/mocas_wang/article/details/10762101001.什么......
  • java 是值传递还是引用传递
    首先要明白,修改一个对象,可以是修改对象的属性值,也能使建立新的引用(指向另一个对象)两种情况值传递在函数调用的过程中,参数是变量的副本,就是复制出来的一个对象,函数中无......
  • 关于Java基础复习-第三天的复习总结
    1、流程控制语句(应用)在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺......
  • 关于Java基础-第四天的复习总结
    1.数组1.1什么是数组【理解】数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。1.2数组定义格式【记忆】1.2.1第一种数据类型[]数组名示例:int[]......
  • 关于Java基础-第五天的复习笔记
    1.方法概述1.1方法的概念(理解)方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集注意:方法必须先创建才可以使用,该过程成为方法定义......
  • 2023-02-10 java方法快速入门
    1.java方法快速入门使用点击查看代码publicclassmethodone{publicstaticvoidmain(String[]args){Personone=newPerson();one.speak......