實現同步的三種方法
多線程共享數據時,會發生線程不安全的情況,多線程共享數據必須同步。
實現同步的三種方法:
- 使用同步代碼塊
- 使用同步方法
- 使用互斥鎖ReetrantLock(更靈活的代碼控制)
代碼示例:
import java.util.concurrent.locks.ReentrantLock;
public class SyncThreadDemo {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
new Thread(mr).start();
new Thread(mr).start();
}
}
class MyRunnable implements Runnable {
private int tickts = 10;
@Override
public void run() {
for (int i = 0; i < 100; i++) {
// if (tickts > 0) {
// 方法一:使用同步代碼塊
// synchronized (this) {
// System.out.println("第" + (tickts--) + "張票售出");
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }
// 方法二:使用同步方法達到線程安全
saleTickts();
// 方法三:使用ReentrantLock,更加靈活,可以加入判斷,在特定的情況下釋放鎖
saleTickts2();
}// for
}
// 同步方法:同步的是當前對象
private synchronized void saleTickts() {
if (tickts > 0) {
System.out.println("第" + (tickts--) + "張票售出");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}// saleTickts
ReentrantLock lock = new ReentrantLock();
// 方法三:使用ReentrantLock,更加靈活,可以加入判斷,在特定的情況下釋放鎖
private void saleTickts2() {
lock.lock();
try {
if (tickts > 0) {
System.out.println("第" + (tickts--) + "張票售出");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 保證鎖一定會被釋放,不會出現死鎖情況
} finally {
lock.unlock();// 釋放鎖
}
}// saleTickts2
}
