怎么实现Java线程安全问题

介绍

这篇文章主要介绍怎么实现Java线程安全问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

这篇文章主要介绍了如何实现Java线程安全问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

<强>解决线程安全问题的第一种方案:使用同步代码块

格式:

同步(锁对象){

可能会出现线程安全问题的代码(访问了共享数据的代码)

}

注意:代码块中的锁对象,可以是任意对象,但必须保证多个线程之间使用的是同一个

锁对象的作用是把同步代码块锁住,同一时间只能让一个线程在同步代码块中执行

包com.fgy.demo02;/* * *实现卖票案例*/公共类RunnableImpl实现Runnable{,私人int票=100;,对象obj=新对象();@Override大敌;公共空间run () {,,而(true) {,同步(obj){大敌;,,,如果(机票比;0){,,,,试着{大敌;,,,,,thread . sleep (100);,,,,,}捕捉(InterruptedException e) {,,,,,,e.printStackTrace ();,,,,}大敌;,,,,System.out.println (Thread.currentThread () . getname() +“正在买第“;+门票+“张票“);,,,,,机票,,,,}大敌;,}大敌;,}}}

包com.fgy.demo02;公共类Demo01Ticket{,公共静态void main (String [] args) {,,RunnableImpl运行=new RunnableImpl ();,,新线程(运行).start ();,,新线程(运行).start ();,,新线程(运行).start ();,}}

<强>解决线程安全问题的第二种方案:使用同步方法

使用步骤:

1。把访问了共享数据的代码抽取出来,放到一个方法中

2。在方法上添加同步修饰符

格式:

修饰符同步返回值类型方法名(…){

可能会出现线程安全问题的代码(访问了共享数据的代码)

}

同步方法的锁对象是:这个

静态同步方法的锁对象不能是这样,因为这是创建对象后产生的,静态方法优先于对象

静态方法的锁对象是本类的类文件对象

包com.fgy.demo03;/* * *实现卖票案例*/公共类RunnableImpl实现Runnable{,私人int票=100;@Override大敌;公共空间run () {,,而(true) {,,payTicket ();,,}},公共同步空白payTicket () {,,如果(机票比;0){,,试着{大敌;,,,thread . sleep (100);,,,}捕捉(InterruptedException e) {,,,,e.printStackTrace ();,,}大敌;,,System.out.println (Thread.currentThread () . getname() +“正在买第“;+门票+“张票“);,,,机票,,,}}}

解决线程安全问题的第三种方案:使用锁锁

使用步骤:

1。在成员位置创建ReenterantLock对象

2。在可能出现安全问题的代码前调用锁接口中的方法锁()获取锁

3。在可能出现安全问题的代码后调用锁接口中的方法解锁()释放锁

包com.fgy.demo04;进口java.util.concurrent.locks.Lock;进口java.util.concurrent.locks.ReentrantLock;/* * *实现卖票案例*/公共类RunnableImpl实现Runnable{,私人int票=100;,锁l=新的ReentrantLock ();/* @Override大敌;公共空间(){运行,,而(true) {,,l.lock ();,,,如果(机票比;0){,,,试着{大敌;,,,,thread . sleep (100);,,,,}捕捉(InterruptedException e) {,,,,,e.printStackTrace ();,,,}大敌;,,,System.out.println (Thread.currentThread () . getname() +“正在买第“;+门票+“张票“);,,,,机票,,,}大敌;,,l.unlock ();,,}}*/,@Override,公共空间(){运行,,而(true) {,,l.lock ();,,,如果(机票比;0){,,,试着{大敌;,,,,thread . sleep (100);,,,,,System.out.println (Thread.currentThread () . getname() +“正在买第“;+门票+“张票“);,,,,,机票,,,,,}捕捉(InterruptedException e) {,,,,,e.printStackTrace ();,,,最后,}{,,,,,//无论程序是否发生异常都会释放锁,,,,,l.unlock ();,,,}大敌;,}大敌;,}}}

以上是“怎么实现Java线程安全问题”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

怎么实现Java线程安全问题