方法a这样声明,表示一个线程只有获取了当前Test实例的锁时才可以执行apublic synchronized void a(){
System.out.println("aa");
}方法b也是一样,它要求的也是同样的锁main方法所在的线程执行b,就已经获得了this对应的锁,所以它可以执行方法a,就相当于你家的所有的门都使用同一把钥匙,那么你只要带一把钥匙就可以了。
System.out.println("aa");
}方法b也是一样,它要求的也是同样的锁main方法所在的线程执行b,就已经获得了this对应的锁,所以它可以执行方法a,就相当于你家的所有的门都使用同一把钥匙,那么你只要带一把钥匙就可以了。
解决方案 »
- 一个菜鸟对map 的json和实体类的困惑
- JFreeChart 乱码问题,请高手指教
- 如何判断EL表达式和一个变量相等
- eclipse中编码格式的问题
- 一个关于jspsmartupload下载的问题
- 100分求一个问题的解决
- 提示UserDirectory.getInstance().setUser(username,password1);variable UserDirectory
- 怎样检测window是否安装了Windows Media play 8.0以上版本
- 在框架中带参数传递出错,大家帮忙看看!谢谢!
- 有没有加密jsp代码的软件
- 哪位有javabean实现的,jsp显示记录集表格封装到javabean中的
- 求教:关于访问.ini文件文件位置问题!
真怀疑你懂不懂什么synchronized的具体含义和用法.
不写用户多线程怎么看的出是同步还是异步的?
All threads that are not daemon threads have died, either by returning from the call to the run method or by throwing an exception that propagates beyond the run method. 恰恰相反,执行main方法的是一个非“精灵线程”。而且你所说的关系也是错误的,不是main方法产生线程,而是虚拟机产生一个线程来调用main方法。Daemon thread也可以叫后台线程,或守护线程,这种线程一般负责执行后台任务,我猜测(只是猜测)在有些虚拟机的实现中,垃圾收集可能是在一个daemon thread中进行的。虚拟机在所有非daemon thread执行结束后退出,也就是说,如果用户程序没有启动别的线程,那么main方法退出后,虚拟机就会退出。一个特殊的情况是AWT或Swing程序,因为其中有一个线程用于事件分发(event dispatch)和重画(repaint),关于这个问题,可以参考下面的文章,讲的是AWT线程问题http://java.sun.com/j2se/1.4.2/docs/api/java/awt/doc-files/AWTThreadIssues.html>>不懂不要装懂,更不要误倒别人我原来对daemon thread还真的是一知半解,现在比较清楚了。sunjie1981,你清楚了吗?现在你告诉我,是谁在误导别人?奉劝你一句:没有把握的话,不要说那么满。>>真怀疑你懂不懂什么synchronized的具体含义和用法我当然懂,如果对这个java的基本问题没有比较清楚的认识,我是不会来贸然回答这个问题的。楼主的疑问是,两个方法都同步了,为什么可以在一个方法中执行另一个。我只想用比较形象、简单的方式让他明白这个问题,一个线程拥有了一个对象对应的锁后,当然可以执行别的在同一个对象上同步的方法。我不想说一大堆synchronized的东西,那样可能会更糊涂。如果你对这个问题不是很清楚,可以从这里http://java.sun.com/docs/books/vmspec/下载 Java Virtual Machine Specification,其中 2.19 节介绍了线程还可以从这里http://java.sun.com/docs/books/jls/下载 Java Language Specification,其中12.1 节讲了虚拟机启动,第17章讲的是线程和锁>>不写用户多线程怎么看的出是同步还是异步的我已经说过了,一段代码用synchronized做了同步处理,就说明它准备应用于多线程环境。如果你看不出来,只能说明你自己有问题。诚然,synchronized方法或代码也可以在单线程环境(只是指用户应用是单线程,而不是指虚拟机环境)执行,但synchronized不仅仅是个符号,线程要执行这个方法,还是要获得对应的锁,这些都是要耗费资源的。说点题外话,我不满的是你这种态度。如果你懂,就让别人也懂;如果不懂,至少不要乱说。
真不知道怎么说你了,请弄清JVM的作用,JVM是调度线程的.
如果你说MAIN()产生的不是精灵线程,那算什么?难道是用户线程?JAVA就分2种线程类别.还有你说单线程可以用synchronized,这个我不否认.
我最终意思就是说楼主举例不到位.
当Java虚拟机启动时、通常会有一个非daemon线程(就是MAIN方法)、Java虚拟机持续执行之直到:
The exit method of class Runtime has been called and the security manager has permitted the exit operation to take place.
All threads that are not daemon threads have died, either by returning from the call to the run method or by throwing an exception that propagates beyond the run method.
运行时类退出并且得到安全管理的允许、
所有非daemon线程终止、或者执行完毕、抛出异常。
chongkai() 佩服!楼主的答案不就是这个吗,让我重贴一次!
方法a这样声明,表示一个线程只有获取了当前Test实例的锁时才可以执行apublic synchronized void a(){
System.out.println("aa");
}方法b也是一样,它要求的也是同样的锁main方法所在的线程执行b,就已经获得了this对应的锁,所以它可以执行方法a,就相当于你家的所有的门都使用同一把钥匙,那么你只要带一把钥匙就可以了。