方式三:Lock锁 --- JDK5.0新增
*
同步锁使用Lock对象充当
ReentrantLock类实现了Lock
新建的ReentrantLock对象,括号里true表示线程有着先后次序,先进先出。不写则默认为false
package main.java.ThreadRunnable; import java.util.concurrent.locks.ReentrantLock; /** * @Author lx * @Description lock锁 * @Date 14:59 2020/8/4 * @Version */ class windows implements Runnable{ private int ticket =100; private ReentrantLock lock = new ReentrantLock(true); //新建RenntrantLock @Override public void run() { while (true){ try { lock.lock(); //lock锁 if (ticket>0){ System.out.println(Thread.currentThread().getName()+":"+ticket); ticket--; }else break; }finally { lock.unlock(); //手动解锁 } } } } public class windowRunnable { public static void main(String[] args) { windows windows = new windows(); Thread t1 = new Thread(windows); Thread t2 = new Thread(windows); t1.setName("窗口一:"); t2.setName("窗口二:"); t1.start(); t2.start(); } }
使用的优先顺序:
* Lock ---> 同步代码块(已经进入了方法体,分配了相应资源 ) ---> 同步方法(在方法体之外)
3.利弊
同步的方式,解决了线程的安全问题。---好处
操作同步代码时,只能一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低。