我试图创建10个线程,每个线程运行100.000次。因此,我做了一个循环,循环每一个线程。它应该每次递增静态x+1。
public class CAOS_thread_demo_5 extends Thread
{
public static int x = 0;
public static void main(String[] args)
{
CAOS_thread_demo_5 humhum1 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum2 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum3 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum4 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum5 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum6 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum7 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum8 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum9 = new CAOS_thread_demo_5();
CAOS_thread_demo_5 humhum10 = new CAOS_thread_demo_5();
humhum1.start();
humhum2.start();
humhum3.start();
humhum4.start();
humhum5.start();
humhum6.start();
humhum7.start();
humhum8.start();
humhum9.start();
humhum10.start();
try
{
humhum1.join();
humhum2.join();
humhum3.join();
humhum4.join();
humhum5.join();
humhum6.join();
humhum7.join();
humhum8.join();
humhum9.join();
humhum10.join();
}
catch(Exception e)
{}
System.out.println();
System.out.println("*** the end ***");
System.out.println("#### counter: " + x);
}
public void run()
{
for (int i = 0; i < 100000; i++) {
x++;
}
}
}
首先,x++
不是原子的:它是对增量值的读取,然后是对增量值的写入。其他线程可以在这些操作之间交错。
其次,您不能保证x
以前更新的可见性:您不能保证看到其他线程编写的更新,因此线程可能只是践踏其他线程编写的值。您可以通过使x
volatile
来解决这个问题,但这并不能解决原子性问题。
在x++
周围使用同步块(使用公共监视器,例如CAOS_Thread_Demo_5.Class
);或者使用AtomicInteger
,它保证了可见性,并提供了原子增量方法(GetAndIncrement()
、IncrementAndGet()
)。
我为PHP代码设置了一个Cron作业,使其每20分钟运行一次。但它每次都会杀死EC2T2Micro实例。以下是服务器日志。Pls帮助。 ip-172-31-42-52登录:[20332.164336]内存不足:杀死进程1241(java)得分174或牺牲子 [20332.192538]杀死进程1241(java)总计-VM:1473180KB,Anon-RSS:176012KB,文件-RSS:0K
我尝试在每次创建活动时运行以下线程。它第一次工作,但如果我按下后退按钮并尝试再次导航到活动,它总是崩溃第二次。我怎样才能确保这个线程每次都运行成功呢?
问题内容: 我在尝试计算字符串的md5哈希值时遇到了一些非常奇怪的行为。如果我传递的是串联结果,则返回的哈希值总是错误的(且与众不同)。获得真正的哈希的唯一方法是传递创建后未进行任何修改的字符串。 我想念什么吗? 问题答案: 您缺少的是 不会替换散列数据 。您将不断更新哈希对象,因此您将获得 串联字符串 的哈希值。从文档中: 使用字符串 arg 更新哈希对象。 重复调用等效于将所有参数串联在一起的
我对C语言编程有点陌生,我觉得用C语言做一个brainfuck解释器是学习这门语言的好方法。我可以用这些bf代码编写和测试: 这应该会打印一个hello world 这和预期的一样,所以我认为我的解释器工作得很好,但是当我用你好世界代码的几个变体进行测试时,奇怪的事情发生了。 这个bf代码也应该打印一个hello world,但它会打印出