如何实现线程的同步

网友投稿 564 2022-11-19

如何实现线程的同步

如何实现线程的同步

在上面的一节中我们看到了是线程不同的不问题,那么对于这样的线程不同步,我们是可以利用上锁的方式来解决。同步表示的是线程不同时进入一段代码或者是一个方法,而是按照一定的顺序进入一个代码块。实现同步我们可以用同步代码块来解决,可以用不同方法来解决。

我们来看同步方法:

package com.epoint.wdgtest;public class WdgTest{ //用休眠来看程序的并发执行 public static void main(String [] args){ myThread mt1=new myThread(); new Thread(mt1,"线程1").start(); new Thread(mt1,"线程2").start(); new Thread(mt1,"线程3").start(); } }class myThread implements Runnable{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){ this.scale(); } } public synchronized void scale(){ if(this.ticket>=1){ try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"获取"+this.ticket--+"号"); } }}

最后的输出结果如下:

为了让线程的同步,我们可以对一些方法进行上锁,上锁也就类似于排队上厕所,当有一个人在厕所的时候,其他的线程只能在外面进行等待,因为前面的人已将在锁上的厕所的门,等里面的人出来,等着的线程才可以进入。上面的是通过对创建同步方法来实现同步,其实我们还可以利用同步代码块的方法来实现线程的同步:

package com.epoint.wdgtest;public class WdgTest{ //用休眠来看程序的并发执行 public static void main(String [] args){ myThread mt1=new myThread(); new Thread(mt1,"线程1").start(); new Thread(mt1,"线程2").start(); new Thread(mt1,"线程3").start(); } }class myThread implements Runnable{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){ synchronized (this) { if(this.ticket>=1){ try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"获取"+this.ticket--+"号"); } } } } }

上面我们在方法的内部来对一段代码进行上锁来实现同步的功能,这个就是同步代码块。结果和同步方法输出的结果是一样的,也就是实现了我们想要的功能。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mybatis接口绑定失效的解决
下一篇:mysql创建存储过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~