java 线程安全 block_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--));

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值