多线程使用同步方法解决线程安全问题
仍然还是两个线程窗口卖票
当一次任务是在一个方法中完成的,那么我们可以将这个方法封装,即锁这个方法
如下是同步方法的代码;
/** * */
package com.yan;
/** * @author 雷雨 * */
public class TestThread {
/** * @param args */
public static void main(String[] args) {
MyThread my1 = new MyThread("窗口一");
MyThread my2 = new MyThread("窗口二");
my1.start();
my2.start();
}
}
class MyThread extends Thread {
private static TicketService ts = new TicketService();
public MyThread(String name) {
super(name);
}
public void run(){
while(true) {
if(ts.hasTicket()) {
oneticketsale();
}else {
break;
}
}
}
//使用了同步方法的方式完成了线程
public synchronized static void oneticketsale() {
synchronized (ts) {
if(ts.hasTicket()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖出了"+ts.sale());
}
}
}
}
注意
在分离要锁着的方法块的代码的时候,要分析那些部分的代码是线程***享的.