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 blocke.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 blocke.printStackTrace(); }System.out.println(Thread.currentThread().getName()+' sold '+(ticket--)); } } }
这样就完成了线程安全的小测试。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章: