/**
* 只有获得锁对象,才能执行同步代码块。每个线程执行完同步代码块才会释放锁
*/
public class Main {
public static void main(String[] args) {
Ticket ticket=new Ticket();//创建一个Runnable对象,保证调用同一个run方法
new Thread(ticket).start();
new Thread(ticket).start();
new Thread(ticket).start();
}
}
class Ticket implements Runnable {
private int ticket=100;
Object o=new Object();//创建run方法外面,保证多线程调用run方法锁对象的唯一
@Override
public void run() {
synchronized (o){
for(;ticket>0;ticket--){
System.out.println("第"+ticket+"张票 "+Thread.currentThread().getName());
}
}
}
}
Lock的使用
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 只有获得锁对象,才能执行同步代码块。每个线程执行完同步代码块才会释放锁
*/
public class Main {
public static void main(String[] args) {
Ticket ticket=new Ticket();//创建一个Runnable对象,保证调用同一个run方法
new Thread(ticket).start();
new Thread(ticket).start();
new Thread(ticket).start();
}
}
class Ticket implements Runnable {
private int ticket=100;
Lock l=new ReentrantLock();
Object o=new Object();//创建run方法外面,保证多线程调用run方法锁对象的唯一
@Override
public void run() {
l.lock();
for(;ticket>0;ticket--){
System.out.println("第"+ticket+"张票 "+Thread.currentThread().getName());
}
l.unlock();
}
}