3.java如何实现线程的安全,线程的同步机制
- 方式一:同步代码块
- synchronized (同步监视器){
- //需要被同步的代码块(即为操作共享数据的代码)
- }
- 1.共享数据:多个线程共同操作的同一个数据(变量)
- 2.同步监视器:由一个类的对象来充当。那个线程获取此监视器,
- 谁就执行大括号里被同步的代码,俗称锁
- 要求:所有的线程必须公用同一把锁
- 注:在实现的方式中,考虑同步的话,可以使用this来充当锁。但是在继承的方式中,
- 慎用this 继承方式中run()都有自己的对象 不是公用的对象
public class TestWindow1 {
public static void main(String[] args) {
Window1 w = new Window1();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName("一号窗口");
t2.setName("二号窗口");
t3.setName("三号窗口");
t1.start();
t2.start();
t3.start();
}
}
class Window1 implements Runnable{
int ticket = 100;
Object obj = new Object();
public void run() {
while(true) {
synchronized(obj) {
if(ticket > 0) {
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "售票:票号为:"+ ticket--);
}
}
}
}
class Window extends Thread{
static int ticket = 100;
static Object obj = new Object();
public void run() {
while(true) {
synchronized(obj) {
if(ticket >0) {
System.out.println(Thread.currentThread().getName()+"售票,票号为:"+ticket--);
}else {
break;
}
}
}
}
}
public class TestWindow {
public static void main(String[] args) {
Window w1 = new Window();
Window w2 = new Window();
Window w3 = new Window();
w1.setName("窗口1");
w2.setName("窗口2");
w3.setName("窗口3");
w1.start();
w2.start();
w3.start();
}
}
}