1. Java在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
  2. 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
  3. 关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问
  4. 同步的局限性:导致程序的执行效率要降低
  5. 同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)
  6. 同步方法(静态的)的锁为当前类本身

注意事项:

  1. 同步方法如果没有使用static修饰:默认锁对象为this
  2. 如果方法使用static修饰,默认锁对象:当前类.class
  3. 实现的落地步骤:
  • 需要先分析上锁的代码
  • 选择同步代码块或同步方法
  • 要求多个线程的锁对象为同一个即可!
  1. package test;
  2. public class Main {
  3. public static void main(String[] args) {
  4. //测试
  5. SellTicket sellTicket = new SellTicket();
  6. new Thread(sellTicket).start();//第1个线程-窗口
  7. new Thread(sellTicket).start();//第2个线程-窗口
  8. new Thread(sellTicket).start();//第3个线程-窗口
  9. }
  10. }
  11. //实现接口方式, 使用synchronized实现线程同步
  12. class SellTicket implements Runnable {
  13. private int ticketNum = 100;//让多个线程共享 ticketNum
  14. private boolean loop = true;//控制run方法变量
  15. Object object = new Object();
  16. //同步方法(静态的)的锁为当前类本身
  17. //1. public synchronized static void m1() {} 锁是加在 SellTicket.class
  18. //2. 如果在静态方法中,实现一个同步代码块.
  19. /*
  20. synchronized (SellTicket.class) {
  21. System.out.println("m2");
  22. }
  23. */
  24. public synchronized static void m1() {
  25. }
  26. public static void m2() {
  27. synchronized (SellTicket.class) {
  28. System.out.println("m2");
  29. }
  30. }
  31. //1. public synchronized void sell() {} 就是一个同步方法
  32. //2. 这时锁在 this对象
  33. //3. 也可以在代码块上写 synchronize ,同步代码块, 互斥锁还是在this对象
  34. public /*synchronized*/ void sell() { //同步方法, 在同一时刻, 只能有一个线程来执行sell方法
  35. synchronized (/*this*/ object) {
  36. if (ticketNum <= 0) {
  37. System.out.println("售票结束...");
  38. loop = false;
  39. return;
  40. }
  41. //休眠50毫秒, 模拟
  42. try {
  43. Thread.sleep(50);
  44. } catch (InterruptedException e) {
  45. e.printStackTrace();
  46. }
  47. System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
  48. + " 剩余票数=" + (--ticketNum));//1 - 0 - -1 - -2
  49. }
  50. }
  51. @Override
  52. public void run() {
  53. while (loop) {
  54. sell();//sell方法是一个同步方法
  55. }
  56. }
  57. }

image.png