1. 同步代码块
1 package cn.itcast.day_05.test_02;
2
3 public class RunnableImpl implements Runnable{
4
5 private int tickets = 100;
6
7 //创建对象
8 Object obj = new Object();
9
10 //设置线程任务
11 @Override
12 public void run() {
13 //票存在,卖票
14 while (true){
15 synchronized (obj){ //同步代码块
16 if (tickets > 0){
17 //提高安全性
18 try {
19 Thread.sleep(1000);
20 } catch (InterruptedException e) {
21 e.printStackTrace();
22 }
23 System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
24 tickets--;
25 }
26 }
27 }
28 }
29 }
2. 同步方法
1 package cn.itcast.day_05.test_02;
2
3 public class RunnableImpl2 implements Runnable{
4
5 private int tickets = 100;
6
7 @Override
8 public void run() {
9 while (true){
10 payTickets();
11 }
12 }
13
14 //静态同步方法
15 public synchronized void payTickets(){
16 if (tickets > 0){
17 try {
18 Thread.sleep(1000);
19 } catch (InterruptedException e) {
20 e.printStackTrace();
21 }
22 System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
23 tickets--;
24 }
25 }
26 }
3. 静态同步方法
1 package cn.itcast.day_05.test_02;
2
3 public class RunnableImpl2 implements Runnable{
4
5 private static int tickets = 100;
6
7 @Override
8 public void run() {
9 while (true){
10 payTickets();
11 }
12 }
13
14 //静态同步方法
15 public static synchronized void payTickets(){
16 if (tickets > 0){
17 try {
18 Thread.sleep(1000);
19 } catch (InterruptedException e) {
20 e.printStackTrace();
21 }
22 System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
23 tickets--;
24 }
25 }
26 }
4. Lock锁
1 package cn.itcast.day_05.test_02;
2
3 import java.util.concurrent.locks.Lock;
4 import java.util.concurrent.locks.ReentrantLock;
5
6 public class RunnableImpl3 implements Runnable{
7
8 private int tickets = 100;
9
10 //创建ReentrantLock对象
11 Lock i = new ReentrantLock();
12
13 @Override
14 public void run() {
15 while (true){
16
17 //加锁
18 i.lock();
19
20 if (tickets > 0){
21 try {
22 Thread.sleep(1000);
23 System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets+"张票");
24 tickets--;
25 } catch (InterruptedException e) {
26 e.printStackTrace();
27 }finally { //无论程序是否异常,都会释放锁
28 //解锁
29 i.unlock();
30 }
31 }
32 }
33 }
34 }