1.线程加锁
多个线程需要共享对同一个数据的访问。如果每个线程都会调用一个修改共享数据状态的方法,那么,这些线程将会互相影响对方的运行。在Java语言中,引入对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问对象。就像上一篇博客讲到用多线程模拟售票时,会出现两个车站卖同一张票的时候,这种情况就需要我们在对卖票时加锁,有一个线程访问这段代码时,别的线程就不能访问,保证不会发生两个线程同时访问同一个数据的情况。java的加锁方式有以下两种:
①synchronized同步代码块
当某个对象用修饰时,表明该对象在任一时刻只能由一个线程访问。
语法:
synchronized(this){
//需要同步的代码;
}
示例:
public void run() {
while(sign) {
synchronized (this) {
if(ticket >= 1) {
System.out.println(Thread.currentThread().getName() + ":" + this.ticket--);
}else{ sign = false; }
}
}
}
或者
public synchronized void sale(){
ticket--;
}
②显式加锁:JDK5.0后提出,注意,我们加的锁的粒度越细越好。
语法:
private static final Lock lock = new ReentrantLock(); //创建Lock实例 lock.lock(); //获取锁 //需要同步的代码 lock.unlock(); //释放锁
实例:
public void run() {
while(sign) {
lock.lock();
if(ticket >= 1) {
System.out.println(Thread.currentThread().getName() + ":" + this.ticket--);
}else {
sign = false;
}
lock.unlock();
}
}
来源:https://www.cnblogs.com/qilin20/p/12306361.html