什么是臟讀
什么是臟讀
- 本次事務(wù)訪問到了其他事務(wù)未提交的數(shù)據(jù)
代碼
service.java
package com.service;
import java.util.ArrayList;
import java.util.List;
/**
* 臟讀
*/
public class Service {
private List<Object> lists = new ArrayList<Object>();
public void print() throws InterruptedException {
lists.add("abc");
System.out.println("休息5秒鐘,制造臟讀場景大小是:" + lists.size());
Thread.sleep(5000);
lists.remove("abc");
System.out.println("回退操作:" + lists.size());
}
public int getSize() {
return lists.size();
}
}
ThreadA.java
package com.service;
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service) {
this.service = service;
}
@Override
public void run() {
try {
Thread.sleep(200);
int size = service.getSize();
System.out.println(Thread.currentThread().getName()+ "->讀取到的大小是:"+size);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ThreadB.java
package com.service;
public class ThreadB extends Thread {
private Service service;
public ThreadB(Service service){
this.service = service;
}
@Override
public void run() {
System.out.println("開始增加");
try {
service.print();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("結(jié)束增加");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Run.java
package com.service;
public class Run {
public static void main(String[] args) {
Service service = new Service();
ThreadA a = new ThreadA(service);
a.setName("A");
a.start();
ThreadB b = new ThreadB(service);
b.setName("B");
b.start();
}
}
運(yùn)行結(jié)果是:
開始增加
休息5秒鐘,制造臟讀場景大小是:1
A->讀取到的大小是:1
回退操作:0
結(jié)束增加
Process finished with exit code 0
解決方法
- 增加鎖synchronized
service.java
public class Service {
//線程不安全的類
private List<Object> lists = new ArrayList<Object>();
public void print() throws InterruptedException {
synchronized (Service.class){
lists.add("abc");
System.out.println("休息5秒鐘,制造臟讀場景大小是:" + lists.size());
Thread.sleep(5000);
lists.remove("abc");
System.out.println("回退操作:" + lists.size());
}
}
public int getSize(){
synchronized (Service.class){
return lists.size();
}
}
}