首先看不使用Lock来访问共享资源区出现的异常
import java.util.concurrent.locks.ReentrantLock;
import static myprint.Print.*;
public class ThreadTest {
static int a = 0;
public void Aplus(){
a++;
println("a = "+a);;
}
public void Aminus(){
a--;
println("a = "+a);;
}
public static void main(String[] args) {
ThreadTest myLockTest = new ThreadTest();
Thread thread_b = new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
Thread.sleep(100);
myLockTest.Aplus();
}
}
});
Thread thread_a = new Thread(new Runnable() {
@Override
public void run() {
while (true){
Thread.sleep(100);
myLockTest.Aminus();
}
}
});
thread_a.start();
thread_b.start();
}
}
不加锁结果如下图
两个线程使用相同的调度时间,不加锁的线程多加了几次出现异常
使用Lock对象就解决了任务不同步的问题
import java.util.concurrent.locks.ReentrantLock;
import static myprint.Print.*;
public class ThreadTest {
static int a = 0;
//定义锁
private ReentrantLock mylock = new ReentrantLock();
public void Aplus(){
boolean captured = mylock.tryLock();
try {
a++;
println("a = "+a);;
}finally {
if (captured){
mylock.unlock();
}
}
}
public void Aminus(){
boolean captured = false;
try {
captured = mylock.tryLock();
a--;
println("a = "+a);;
}finally {
if (captured){
mylock.unlock();
}
}
}
public static void main(String[] args) {
ThreadTest myLockTest = new ThreadTest();
Thread thread_b = new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
Thread.sleep(100);
myLockTest.Aplus();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread thread_a = new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
Thread.sleep(100);
myLockTest.Aminus();
} catch (InterruptedException e) {
}
}
}
});
thread_a.start();
thread_b.start();
}
}
加锁结果如下图
加锁的线程就是正常的加减