学习Java多线程时想到的一个有关继承Thread实现同步时生成同步监视器的笨办法
问题引入
通过继承Thread类实现多线程,而后通过使用synchronized代码块来实现多线程的同步问题,此时需要着重解决的是对synchronized传入同一个对象.
例如,3个窗口同时售卖50张票,通过使Window类继承Thread类的方式创建多线程,需要创建3个Window类的对象,那么如何定义同一个传入synchronized的同步监视器呢
最优方法
在Window类中定义静态的任意类的一个对象,此时三个窗口虽然创建了三个Window类,但是共用了静态域中的同一个static的同步监视器
public class WindowTest{
public static void main(String[] args) {
/**用同步代码块实现继承Thread类的同步
*
*/
Window w1 = new Window("窗口一");
Window w2 = new Window("窗口二");
Window w3 = new Window("窗口三");
w1.start();
w2.start();
w3.start();
}
}
class Window extends Thread {
/**
* 该变量必须是静态的,为何????
* 我们创建了类的多个对象,多个对象共享同一个静态变量,
* 当通过某一个对象修改静态变量时,会导致其他对象调用
* 此静态变量时,是修改过了的
*/
private static int ticket = 100;
//声明一个静态的锁
static Object o = new Object();
//创建window类对象时,传入 锁
public Window(String name) {
super(name);
}
@Override
public void run() {
while (true) {
synchronized (o) {
if(ticket > 0) {
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "卖票,票号为:" + ticket);
ticket --;
}else {
break;
}
}
}
}
}
我学习时想到的笨方法,此处单纯记录一下
window类中,定义构造器,该构造器包含参数Object类对象,在main方法中定义一个Object类的对象,作为共同的同步监视器,之后在声明3个window类对象时,传入该同步监视器
public class WindowTest{
public static void main(String[] args) {
/**用同步代码块实现继承Thread类的同步
*
*/
//创建多个线程之前,应该创建统一的锁
Object o = new Object();
Window w1 = new Window("窗口一",o);
Window w2 = new Window("窗口二",o);
Window w3 = new Window("窗口三",o);
w1.start();
w2.start();
w3.start();
}
}
class Window extends Thread {
/**
* 该变量必须是静态的,为何????
* 我们创建了类的多个对象,多个对象共享同一个静态变量,
* 当通过某一个对象修改静态变量时,会导致其他对象调用
* 此静态变量时,是修改过了的
*/
private static int ticket = 100;
//声明 锁
Object o;
//创建window类对象时,传入 锁
public Window(String name,Object o) {
super(name);
this.o = o;
}
@Override
public void run() {
while (true) {
synchronized (o) {
if(ticket > 0) {
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "卖票,票号为:" + ticket);
ticket --;
}else {
break;
}
}
}
}
}