1.多线程处理一个int型变量的叠加,在不加锁的情况下会出现数据不一致的情况
package com.testsyn;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
static int nmb = 0;
public static void add() {
nmb++;
}
public static void main(String args[]) {
myRunnable mr = new myRunnable();
ExecutorService exe = Executors.newFixedThreadPool(100);
long time1 = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
exe.execute(mr);
}
exe.shutdown();
while (!exe.isTerminated()) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("nmb:" + nmb + " costtime:" + (System.currentTimeMillis() - time1));
}
public static class myRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
add();
}
}
}
执行结果
nmb:984 costtime:212
2.在函数上加synchronized关键字
package com.testsyn;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
static int nmb = 0;
public synchronized static void add() {
nmb++;
}
public static void main(String args[]) {
myRunnable mr = new myRunnable();
ExecutorService exe = Executors.newFixedThreadPool(100);
long time1 = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
exe.execute(mr);
}
exe.shutdown();
while (!exe.isTerminated()) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("nmb:" + nmb + " costtime:" + (System.currentTimeMillis() - time1));
}
public static class myRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
add();
}
}
}
执行结果
nmb:1000 costtime:211
本文通过两个实验对比了在多线程环境下,不使用synchronized关键字和使用synchronized关键字对int型变量进行叠加操作的结果。实验结果显示,不使用synchronized关键字时,变量叠加可能出现数据不一致的问题;而使用synchronized关键字可以有效避免此类问题,确保数据的一致性和线程安全。

1750

被折叠的 条评论
为什么被折叠?



