如何实现线程的同步

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

我们来看同步方法:

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--+"号");
                }
                
            }
      
        }
    }
  
}
上面我们在方法的内部来对一段代码进行上锁来实现同步的功能,这个就是同步代码块。结果和同步方法输出的结果是一样的,也就是实现了我们想要的功能。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值