1. 在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。
  2. 也可以这里理解:线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。

    同步的具体方法-Synchronized

  3. 同步代码块

    synchronized(对象){//得到对象的锁,才能操作同步代码 //需要被同步代码; }

  1. synchronized还可以放在方法声明中,表示整个方法-为同步方法

    public synchronized void m (String name){ //需要被同步的代码 }

效果:
解决了因多个线程同时操作内存造成超卖现象!

  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. public synchronized void sell() { //同步方法, 在同一时刻, 只能有一个线程来执行sell方法
  16. if (ticketNum <= 0) {
  17. System.out.println("售票结束...");
  18. loop = false;
  19. return;
  20. }
  21. //休眠50毫秒, 模拟
  22. try {
  23. Thread.sleep(50);
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. System.out.println("窗口 " + Thread.currentThread().getName() + " 售出一张票"
  28. + " 剩余票数=" + (--ticketNum));//1 - 0 - -1 - -2
  29. }
  30. @Override
  31. public void run() {
  32. while (loop) {
  33. sell();//sell方法是一个同步方法
  34. }
  35. }
  36. }

image.png