多线程
处理多线程安全问题
1.同步代码块
步骤
1.定义一个类实现Runnable接口,重写run方法,在run方法中编写卖票逻辑
2.创建多个线程,传入接口的实现类对象
3.启动多个线程
代码实例
3个窗口同时售票
//测试类实现
public static void main(String[] args) {
Ticket t = new Ticket();
//将ticket的RUnnable对象交给创建的线程执行
Thread t1 = new Thread(t,"窗口1");//定义线程的名称
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
//开始线程
t1.start();
t2.start();
t3.start();
}
//继承Runnable方法并重写run方法
public class Ticket implements Runnable {
private int num =100;
Object o = new Object();
@Override
public void run() {
while(true){//死循环 一直执行
synchronized (o){ //同步代码块,避免多个线程执行同一个方法体
String name = Thread.currentThread().getName();//获取线程的名称
if(num > 0){//当还有票的时候,打印
System.out.println(name +"第"+(num--)+"张票");
}
}
}
}
}
2.使用同步方法处理
步骤
同步方法格式:
修饰符 synchronized 返回值类型 方法名() {
操作共享数据的代码;
}
代码案例
public static void main(String[] args) {
MyRunnable t = new MyRunnable();
Thread t1 = new Thread(t,"窗口1");
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
t1.start();
t2.start();
t3.start();
}
public class MyRunnable implements Runnable {
private int num = 100;
@Override
public void run() {
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
tickets();//调用方法
}
}
private synchronized void tickets() {//将共享数据的代码放入方法中
if (num > 0) {
String name = Thread.currentThread().getName();
System.out.println(name + "第" + (num--) + "张票");
}
}
}
3.Lock解决线程安全问题
步骤
Lock使用标准方式
lock.lock(); // 获得锁
try {
操作共享资源的代码
} finally {
lock.unlock(); // 释放锁
}
代码示例
public static void main(String[] args) {
LockDemo t = new LockDemo();
Thread t1 = new Thread(t,"窗口1");
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
t1.start();
t2.start();
t3.start();
}
public class LockDemo implements Runnable {
private int num = 100;
Lock lock = new ReentrantLock();//定义锁
Object o = new Object();
@Override
public void run() {
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();//上锁
String name = Thread.currentThread().getName();
if (num > 0) {
System.out.println(name + "第" + (num--) + "张票");
}
lock.unlock();//解锁
}
}
}