/**
* 只有获得锁对象,才能执行同步代码块。每个线程执行完同步代码块才会释放锁
*/
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();
}
}
本文深入探讨了Java中线程同步的两种主要方法:synchronized关键字和Lock接口的使用。通过具体示例,展示了如何利用这两种机制确保多线程环境下的数据一致性,防止竞态条件,特别关注了售票系统的实现。
977

被折叠的 条评论
为什么被折叠?



