1.使用juc中的lock
package org.example.base.test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class AtomicTest {
private int i;
private final Lock lock = new ReentrantLock();
public void add() {
lock.lock();
try {
i++;
} finally {
lock.unlock();
}
}
public Integer getI() {
return i;
}
public static void main(String[] args) {
AtomicTest atomicTest = new AtomicTest();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
atomicTest.add();
}
}).start();
}
while (Thread.activeCount() > 1) {
Thread.yield();
}
System.out.println(atomicTest.getI());
}
}
2.使用java关键字synchronized
package org.example.base.test;
public class AtomicTest {
private int i;
public synchronized void add() {
i++;
}
public Integer getI() {
return i;
}
public static void main(String[] args) {
AtomicTest atomicTest = new AtomicTest();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
atomicTest.add();
}
}).start();
}
while (Thread.activeCount() > 1) {
Thread.yield();
}
System.out.println(atomicTest.getI());
}
}
3.使用juc中的AtomicInteger
package org.example.base.test;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicTest {
AtomicInteger i = new AtomicInteger(0);
public void add() {
i.getAndIncrement();
}
public Integer getI() {
return i.get();
}
public static void main(String[] args) {
AtomicTest atomicTest = new AtomicTest();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
atomicTest.add();
}
}).start();
}
while (Thread.activeCount() > 1) {
Thread.yield();
}
System.out.println(atomicTest.getI());
}
}
4.volatile并不能保证原子性操作
package org.example.base.test;
public class AtomicTest {
private volatile int i;
public void add() {
i++;
}
public Integer getI() {
return i;
}
public static void main(String[] args) {
AtomicTest atomicTest = new AtomicTest();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
atomicTest.add();
}
}).start();
}
while (Thread.activeCount() > 1) {
Thread.yield();
}
System.out.println(atomicTest.getI());
}
}