编程语言
首页 > 编程语言> > java 线程同步

java 线程同步

作者:互联网

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

大周末的还是6点起床,起床的第一件事就是打开电脑,因为昨天下班晚,回去看了会书就休息了,本来今天是可以有一个休息时间的,结果项目出了点小意外,还要去加班,你说心塞不心塞。

文章都是中午时间整理,晚上再编辑发布的,昨天时间太紧,就改成今天早上了。

今天我就像聊一个小知识点,线程同步。

废话不多说,先说概念,小伙伴先想想你的理解。


java线程的同步有一个关键词synchronize从英译过来是 "同时发生"。但其真正的含义和字面意思截然相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。


使用线程同步的目的:
是让各个线程去排队使用资源,而不是让线程同时去使用资源

 

概念只是让我们明白这个东西是干什么的,但是怎么做,具体怎么使用需要通过实例来说明。

对于线程同步我们生活中就有一个很好的例子就是买车票.

你看全国这么多人买票,不同的方式是(车站,携程,12306,代理窗口),车票肯定不是无限的,但是怎么做到让票卖出去,不会出现漏卖和空卖,怎么做到车票同步的呢?

1, 不同步

为了对比我们先来看看 如果 不是同步卖票  会出现什么情况?

public class ThreadSyn implements Runnable{    //有5张票    int ticked = 5;    @Override    //重写run()方法    public void run() {        for(int i=ticked;i>0;i--) {            System.out.println(Thread.currentThread().getName() + " sells " + i + " ticket");        }    }    //main方法测试    public static void main(String[] args) {        //实例化Thread对象        ThreadSyn tT = new ThreadSyn();        Thread td1 = new Thread(tT,"火车站");        Thread td2 = new Thread(tT,"携程");        Thread td3 = new Thread(tT,"代理商");        Thread td4 = new Thread(tT,"12306");        //启动线程        td1.start();        td2.start();        td3.start();        td4.start();    }}

 

输入结果:
火车站 sells 5 ticket
携程 sells 5 ticket
携程 sells 4 ticket
火车站 sells 4 ticket
火车站 sells 3 ticket
火车站 sells 2 ticket
火车站 sells 1 ticket
携程 sells 3 ticket
携程 sells 2 ticket
携程 sells 1 ticket
代理商 sells 5 ticket
代理商 sells 4 ticket
代理商 sells 3 ticket
代理商 sells 2 ticket
代理商 sells 1 ticket
12306 sells 5 ticket
12306 sells 4 ticket
12306 sells 3 ticket
12306 sells 2 ticket
12306 sells 1 ticket

Process finished with exit code 0

 

结果优点崩溃,一共剩余5张票了,但是四个不同的方式,每一个竟然都能买到5张,这是不是有点乱了。

所以就有了同步的概念,当A在买票的时候,B在等待,A买完以后 系统同步票数,直到C去买票的时候,发现没有票了。

public class ThreadSyn implements Runnable{
int ticket = 8; //担任"锁",锁是什么不重要,他只是一把锁 //要求,非空对象 private String mutex = ""; @Override //重写run()方法 public void run() { //while循环 while (true) { synchronized (mutex) { if(ticket > 0) { System.out.println(Thread.currentThread().getName()+ " sells " + ticket-- + " ticket."); }else { break; } } } } //main方法测试 public static void main(String[] args) { //实例化Thread对象 ThreadSyn tT = new ThreadSyn(); Thread td1 = new Thread(tT,"火车站"); Thread td2 = new Thread(tT,"携程"); Thread td3 = new Thread(tT,"代理商"); Thread td4 = new Thread(tT,"12306"); //启动线程 td1.start(); td2.start(); td3.start(); td4.start(); }}

携程 sells 8 ticket.
携程 sells 7 ticket.
携程 sells 6 ticket.
携程 sells 5 ticket.
携程 sells 4 ticket.
携程 sells 3 ticket.
携程 sells 2 ticket.
携程 sells 1 ticket.

Process finished with exit code 0

结果可以添加了同步后,只卖了现有8张票,买完为止。

本文 Github ( 码云Gitee同步) https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaTheead/ThreadSynchron  已收录,欢迎 star。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

标签:同步,java,Thread,携程,线程,new,sells,ticket
来源: https://blog.51cto.com/u_14365196/2993753