欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何实现线程的同步

程序员文章站 2024-03-01 18:15:16
...

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

我们来看同步方法:

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