java怎样解决线程安全问题_Java多线程-如何解决线程安全问题

/*** 例子:创建三个窗口卖票,总票数100张,使用实现Runable接口的方式

*存在线程安全问题,待解决

*

* 1.问题:卖票过程中,出现了重票、错票->线程安全问题

* 2.原因:当某个线程操作车票的过程中,尚未完成操作时,其他线程也参与进来操作车票

* 共享数据(共享信号量):车票数ticket

* 3.解决:锁;

* 4.在java中,通过同步机制来解决线程的安全问题

*

* 方式一:同步代码块

* 关键字

* synchronized(同步监视器)

* {

* //需要被同步的代码

* }

* 1.说明:操作共享数据的代码即为需被同步的代码

* 2.共享数据:多个线程共同操作的变量

* 3.同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。//Object obj=new Object();

* 要求:多个线程必须要共用同一把锁

*

*

*

* 方法二:同步方法

* 如果操作共享数据的代码完整声明在一个方法中,我们不妨将此方法声明为同步的。

* synchronized关键字

* public synchronized void show()

* 同步方法依然涉及同步监视器,只是不需要显示声明

* 非静态的同步方法,同步监视器是this

* 静态的同步方法,同步监视器是当前类本身

*

*

* 5.同步的方式,解决了线程的安全问题。---好处

* 操作同步代码时只能有一个线程参与,其他线程等待,相当于是一个单线程的过程,效率低----局限性

* 死锁问题

* 6.同步监视器是否唯一

*

*@authororz*/

class Window1 implementsRunnable

{private int ticket=100;//同步监视器

Object obj=newObject();

@Overridepublic voidrun() {while (true)

{//同步代码块方法实现数据共享

synchronized(obj)

{if(ticket>0)

{try{

Thread.sleep(100);

}catch(Exception e)

{

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+":卖票,票号为:"+ticket);

ticket--;

}else{break;

}

}

}

}

}public classWindowTest {public static voidmain(String[] args) {

Window1 w=newWindow1();

Thread t1=newThread(w);

Thread t2=newThread(w);

Thread t3=newThread(w);

t1.setName("窗口一");

t2.setName("窗口二");

t3.setName("窗口三");

t1.start();

t2.start();

t3.start();

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值