线程同步的机制是用来解决线程安全问题的
操作同步代码时,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低。
1、Java中同步机制有一下几种方式
1.1、方式一:同步代码块(处理实现Runnable安全问题,Thread实现类实现的话,需要加static保证当前对象的唯一性)
synchronized(同步监视器){
//需要被同步的代码
}
说明: 1、操作共享数据的代码,即为需要被同步的代码
2、共享数据:多个线程共同操作的变量。比如:ticket就是共享数据。
3、同步监视器:俗称锁。任何一个类的对象,都可以充当锁。
要求: 多个线程必须要公用同一把锁
案例(窗口取票案例):
class Windows implements Runnable{
private int tickets = 100;
private Object ob = new Object(); //线程的同一把锁,即同一个对象
@Override
public void run() {
while (true) {
synchronized(ob) {
//通过synchronized来加锁
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":买票,票号为:" + tickets);
tickets--;
} else {
break;
}