这篇文章主要为大家展示了如何实现Java synchronize线程安全测试,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。
创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为兰坪企业提供专业的网站建设、网站设计,兰坪网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
线程的运行是与当前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--));
}
}
}
这样就完成了线程安全的小测试。
以上就是关于如何实现Java synchronize线程安全测试的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看到。
本文标题:如何实现Javasynchronize线程安全测试
文章URL:https://www.cdcxhl.com/article4/gigioe.html
成都网站建设公司_创新互联,为您提供用户体验、Google、营销型网站建设、品牌网站制作、品牌网站设计、移动网站建设
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联