多线程并发,给我们编程带来很多好处,完成更多更有效率的程序。但是也给我们带来线程安全问题。比如多个线程同时操作一个对象时,第一个线程没处理好,第二个线程就进来插一脚,影响了程序执行。为了每个线程被安全执行,需要引入一个对象锁的概念,也就是线程同步方法。
synchronized(Objecrt){你要同步的代码}

实例
模拟一个机票系统:有三个售票点,一天共同卖出2000张票。

1 /*
2 * 作者:白客C
3 * 时间:2020年03月13日
4 * 内容:线程锁实例
5 */
6
7 package com.beekc.www;
8
9 public class Beekc{
10
11 public static void main(String[] args)
12 {
13 //定义三个售票窗口
14 TicketWindow ticketWindow1 = new TicketWindow();
15 //TicketWindow ticketWindow2 = new TicketWindow();
16 //TicketWindow ticketWindow3 = new TicketWindow();
17
18 //启动线程
19 Thread t1 = new Thread(ticketWindow1);
20 Thread t2 = new Thread(ticketWindow1);
21 Thread t3 = new Thread(ticketWindow1);
22 t1.start();
23 t2.start();
24 t3.start();
25
26 }
27
28 }
29
30 //售票窗口类
31 class TicketWindow implements Runnable {
32
33 //一共2000张票
34 private int nums = 2000;
35
36 //覆盖run
37 public void run() {
38 while (true) {
39 //休眠
40 //try {
41 // Thread.sleep(1000);
42 //} catch (Exception e) {
43 // e.printStackTrace();
44 // }
45
46 //要保证其原子性[同步代码块],传一个this对象,这里可以是任意对象
47 synchronized (this)
48 {
49
50 //判断是否有票
51 if (nums > 0) {
52 //显示售票信息
53 //Thread.currentThread().getName()获取线程名字
54 System.out.println(Thread.currentThread().getName() + " 在售出第" + nums + "票");
55
56 //出票速度一秒一张
57 try {
58 Thread.sleep(1000);
59 } catch (Exception e) {
60 e.printStackTrace();
61 }
62 nums--;
63 } else {
64 //售票结束
65 break;
66 }
67 }
68
69 }
70 }
71 }

来源:https://www.cnblogs.com/beekc/p/12490029.html