这篇文章主要为大家展示了如何实现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 100A sold 99A sold 98A sold 97A sold 96A sold 95A sold 94A sold 93A sold 92A sold 91...A sold 10A sold 9A sold 8A sold 7A sold 6A sold 5A sold 4A sold 3A sold 2A 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--));   } } }

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

以上就是关于如何实现Java synchronize线程安全测试的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看到。