多线程情况下保证数据⼀致的⽅法
多线程情况下,怎样确保对同⼀变量的改变出现⼀致性问题
使⽤synchronized关键字
⽐如:对num变量进⾏操作,如果没有synchronized 关键字,即使是使⽤volatile修饰变量,输出的值也会⼩于100000,因为volatile虽然能够保证可见性及顺序性,但是不能保证变量的原⼦性。
private static int num = 0;
private static synchronized void increment() {
num++;
}
使⽤Lock锁
private static int num = 0;
private static Lock lock = new ReentrantLock();
public static void increment() {
lock.lock();
num++;
static修饰的变量lock.unlock();
}
使⽤Atomic原⼦类
private static AtomicInteger ai = new AtomicInteger();
public static void increment() {
}
多线程情况下调⽤:
/
/线程调⽤
public static void threadUse() {
long time1 = new Date().getTime();
for(int i=0;i<10;i++) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int j=0;j<10000;j++) {
increment();
}
}
}).start();
}
//确保所有线程调⽤完毕
while(Thread.activeCount()>1)
Thread.yield(); //继续执⾏此线程
System.out.println("time="+(new Date().getTime()-time1)); //执⾏所⽤时间
}
分别调⽤上述三种情况,输出都是100000,但是执⾏所花的时间是不同的,发现synchronized和lock使⽤的时间基本相同,使⽤Atomic 原⼦类所花时间相对是两种的⼀半,但是当执⾏量越来越⼤的时候发现使⽤synchronized所花的时间还越来越(JDK8)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。