静态同步方法和解决线程安全问题_Lock锁
静态同步方法
静态同步方法:
锁对象是谁?
不能是this, this是创建对象之后产生的,静态方法优先于对象
静态方法的锁对象是本类的class属性-->class文件对象(反射)
解决线程安全问题_Lock锁
线程安全问题的第三种方案: 使用Lock锁
java.util.concurrent.locks.Lock接口
Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。
Lock接口中的方法:
void lock()获取锁。
void unlock() 释放锁。
java,util.concurrent.locks.RenntrantLock implements Lock接口
使用步骤:
1.在成员位置创建一个ReentrantLock对象
2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁
3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁
class Runna implements Runnable{ //定义一个多线程共享的票 private int ticket = 100; //创建一个锁对象 Object obj = new Object(); //1.在成员位置创建一个ReentrantLock对象 Lock l = new ReentrantLock(); @Override public void run() { //使用死循环.让卖票操作重复执行 while (true){ //2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁 l.lock(); if (ticket>0){ try { Thread.sleep(100); //票存在,卖票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票"); ticket--; } catch (InterruptedException e) { e.printStackTrace(); }finally { //3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁 l.unlock(); } } } } }
public static void main(String[] args) { Runna run = new Runna(); new Thread(run).start(); new Thread(run).start(); new Thread(run).start(); }