81,092
社区成员
发帖
与我相关
我的任务
分享
public class C14Test {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(0);
for (int i = 0; i < 100; i++) {
Thread threadAtomic = new Thread(new ThAtomic(atomicInteger));
threadAtomic.start();
}
}
}
class ThAtomic implements Runnable{
AtomicInteger atomicInteger;
//Lock lock;
public ThAtomic(AtomicInteger atomicInteger){
this.atomicInteger = atomicInteger;
//this.lock = new ReentrantLock();
}
@Override public void run() {
try{
//lock.lock();
atomicInteger.incrementAndGet();
System.out.println("当前线程是:"+Thread.currentThread()+" count="+atomicInteger.get());
}finally {
//lock.unlock();
}
}
}
public class LockClass {
AtomicInteger atomicInteger;
Lock lock;
public LockClass(AtomicInteger atomicInteger, ReentrantLock lock) {
this.lock = lock;
this.atomicInteger = atomicInteger;
}
public void operation() {
try {
lock.lock();
System.out.println("当前线程是:" + Thread.currentThread());
int value = atomicInteger.incrementAndGet();
//System.out.println("当前线程是:" + Thread.currentThread() + " value count=" + value);
System.out.println("当前线程是:" + Thread.currentThread() + " atomicInteger.get() count=" + atomicInteger
.get());//用这个取值,不能保证取出来的是当前线程更新的值,有可能在当前线程执行更新后,被其他线程抢占执行情况,导致atomicInteger
//.get()在其他线程更新atomicInteger后,才继续执行并取出来其他线程更新过后的值。需要不同的线程使用一个相同的锁将这两名语句锁住,才可以实现正确的输出。
} finally {
lock.unlock();
}
}
}
public class TestLockCurrent {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(0);
ReentrantLock reentrantLock = new ReentrantLock();//此处保证了所有的线程使用了一个相同的锁。
for (int i = 0; i < 100; i++) {
Runnable r = () -> {
new LockClass(atomicInteger,reentrantLock).operation();
};
Thread t = new Thread(r);
t.start();
}
}
}
public class C14Test {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(0);
for (int i = 0; i < 100; i++) {
Thread threadAtomic = new Thread(new ThAtomic(atomicInteger));
threadAtomic.start();
}
}
}
class ThAtomic implements Runnable {
AtomicInteger atomicInteger;
Lock lock;
public ThAtomic(AtomicInteger atomicInteger) {
this.atomicInteger = atomicInteger;
this.lock = new ReentrantLock();
}
@Override public void run() {
try {
//lock.lock();//这里之所以锁不管用,是因为每个线程全程的锁都是一个新的不一样的锁,在本构造方法上创建的,所以实际上是没有起到锁的作用的。
//将锁换成一个,就可以实现tomicInteger.get()获取到正确的值了。
int value = atomicInteger.incrementAndGet();
System.out.println("当前线程是:" + Thread.currentThread() + " value count=" + value);
//System.out.println("当前线程是:" + Thread.currentThread() + " atomicInteger.get() count=" + atomicInteger
// .get());//用这个取值,不能保证取出来的是当前线程更新的值,有可能在当前线程执行更新后,被其他线程抢占执行情况,导致atomicInteger
//.get()在其他线程更新atomicInteger后,才继续执行并取出来其他线程更新过后的值。
} finally {
//lock.unlock();
}
}
}