这段代码有一个奇怪的问题:
class Test {
private static boolean test = false;
public static void main(String[] args) {
new Thread(() -> {
while (true) {
if (test) {
System.out.println("Print when breakpoint here!");
test = false;
}
}
}, "Thread1").start();
new Thread(() -> {
while (true) {
System.out.println("Print always");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
test = true;
}
}, " Thread2").start();
}
}
如我所料,由于boolean test 不是volatile,Thread1 使用test 的本地缓存值,当Thread2 将其更改为true Thread1 不会做任何事情。但是当我在 System.out.println("Prints when put a breakpoint here!"); 行放置一个断点时,它将到达那里并打印该行!设置断点到底发生了什么?它是否强制程序直接从内存中读取变量的值?还是发生了其他事情?
最佳答案
As I expected, since boolean test is not volatile Thread1 uses local cache value of test and when Thread2 changes it to true Thread1 won't do anything.
您的期望不正确。
根据 Java 语言规范,如果一个线程更新了一个非 volatile 共享变量,而另一个线程随后在没有适当同步的情况下读取它,那么第二个线程可能看到新值,或者它可能看到较早的值。
所以您所看到的是 JLS 允许的。
实际上,当调试代理附加到 JVM 时,它通常会导致 JIT 编译器以较低的优化级别重新编译部分或所有方法……甚至可能使用字节码解释器执行它们。对于在其中设置了断点的方法以及单步执行1 时,很可能会发生这种情况。这可能会导致在调试时使用共享变量但未正确同步的代码出现不同的行为。
这也是同步不充分导致调试困难的原因之一。
As far as I know breakpoints change the instructions of code by adding a special trap called INT 3. So what's really going on?
这就是调试 C/C++ 时发生的情况。没有指定 JVM 如何处理这个问题,但典型的 JVM 有其他选项来实现断点......因为字节码和 JIT 编译。
When I put a
sleep(1)in theThread1before if statement it will also print the line. Is there a same thing happening by adding a sleep?
sleep 会导致当前线程挂起。在实现级别发生的事情未指定。但是, native 线程机制可能会将挂起线程的所有未完成写入(即脏缓存条目)刷新到内存中......作为执行线程上下文切换过程的一部分。
同样,如果您使用 print 语句,典型的 I/O 堆栈具有内部同步,可以触发缓存刷新等。这也可以改变您尝试调试的代码的行为。
但是,我要强调的是,这些行为并未指定。
1 - 允许 JIT 优化器重新排序分配,前提是这不会改变单线程行为。但是,如果您正在调试一个方法并观察变量的值,则重新排序的效果是可见的(对程序员而言)。去优化/解释避免了这种情况。幸运的是,现代 JVM/调试代理可以根据需要“即时”执行此操作。
关于java - 在不可到达的线程中放置断点强制它运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964510/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://