package advanced;
import java.util.concurrent.locks.ReentrantLock;
/**
* 1、多线程共享数据时,会发生线程不安全的情况
* 2、多线程共享数据必须使用同步
* 3、实现同步的三种方法
* (1)使用同步代码块
* (2)使用同步方法
* (3)使用Lock(更灵活的代码控制)
*
*/
public class Demo04 {
public static void main(String[] args) {
MyRunnable5 myRunnable5=new MyRunnable5();
Thread t1=new Thread(myRunnable5);
Thread t2=new Thread(myRunnable5);
t1.start();
t2.start();
}
}
class MyRunnable5 implements Runnable {
private int ticket = 10;
private Object obj = new Object();
@Override
public void run() {
for (int i = 0; i < 100; i++) {
/* if (ticket >= 1) {
synchronized (obj) {
ticket--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您购买的票剩余" + ticket + "张");
}
}*/
method2();
}
}
/*
private synchronized void method() {
if (ticket > 0) {
ticket--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您购买的票剩余" + ticket + "张");
}
}*/
//互斥锁
ReentrantLock lock=new ReentrantLock();
//lock实现同步
private void method2() {
lock.lock();//锁
try {
if (ticket > 0) {
ticket--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("您购买的票剩余" + ticket + "张");
}
}finally {
lock.unlock();//解开锁
}
}
}
线程同步和死锁
最新推荐文章于 2024-10-10 09:56:47 发布