一、解决共享资源竞争问题
使用线程的时候会遇到一个问题:并发工作的时候,如果两个线程调用同一个资源,那么肯定会有一方无法访问。或者说:餐桌上只有一块牛排了,当你用叉子去叉牛排的时候,牛排突然消失了,为了避免这种情况的发生,我们用到了锁。
什么是锁:顾名思义,比如你在一个浴室,当你使用他的时候,上锁,那么想要洗浴的人就进不来,当你使用完毕解锁,下一个人就可以使用并且上锁。这里我们就可以通过关键字synchronized来实现。
synchronized void f() { };
synchronized void g() { };
共享资源一般是对象,当然也可以是其他,所以synchronized是给所有的对象都上锁,只有等f()调用结束并且释放了之后,其他任务才可以使用此类对象
二、买票机制
当你想用两个线程同时计数的时候,synchronized关键字就体现出它的作用,比如计数100,两个线程同时,线程1计数1,线程2计数2,然后线程1计数3,以此类推下去:类似的就是买票机制:
public class ThreadClass implements Runnable{
Ticket tk;
Lock lock = new ReentrantLock();
public ThreadClass(Ticket tk) {
this.tk=tk;
}
public void run() {
for(int i=0;i<50;i++) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
synchronized (tk) {
System.out.println(Thread.currentThread().getName()+"买到第"+tk.ticket+"票");
tk.ticket--;
}
}
}
public synchronized void mp() {
tk.ticket--;
}
}
这样我们就可以实现轮流对单一对象操作