Java synchronize线程安全测试

线程的运行是与当前CPU的资源调度与时间片是有关系的,当一个线程中的执行到某一部分方法的时候轮到另外一个线程来执行相应的代码,所以还没有等到第一个线程执行完那么CPU有切换到另外一个线程来运行其相应的代码,所以这个时候假如操作公共的数据部分就会出现错误

为了解决这个问题,可以使用 synchronized 同步代码块来对公共部分进行同步操作

在用synchronize关键字修饰同步代码块时,运行代码发现不能交替卖票。 以下是初始代码

package com.itheima.Test;

public class Test1a {

  public static void main(String[] args) {
    Ticket1a t1=new Ticket1a();
    new Thread(t1,"A").start();
    new Thread(t1,"B").start();
    new Thread(t1,"C").start();
    
  }

}
class Ticket1a implements Runnable{
   int ticket=100;
  @Override
  public void run() {
    synchronized (Ticket1a.class) {          
    while (true) {
      if (ticket<=0) {
        break;
      }
      try {
        Thread.sleep(20);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        System.out.println(Thread.currentThread().getName()+" sold  "+(ticket--));
    }
    }
  }
}

运行结果:

A sold  100
A sold  99
A sold  98
A sold  97
A sold  96
A sold  95
A sold  94
A sold  93
A sold  92
A sold  91
.
.
.
A sold  10
A sold  9
A sold  8
A sold  7
A sold  6
A sold  5
A sold  4
A sold  3
A sold  2
A sold  1

虽然解决了线程的安全问题,但是不能实现三个窗口交替卖票。后来仔细一看,是synchronize关键字修饰的代码块位置不对,相当于修饰了同步方法。

更改后:

@Override
  public void run() {
    while (true) {
        synchronized (Ticket1a.class) {
      if (ticket<=0) {
        break;
      }
      try {
        Thread.sleep(20);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        System.out.println(Thread.currentThread().getName()+" sold  "+(ticket--));
      }
    }
  }

这样就完成了线程安全的小测试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。