Java线程同步示例
来源:互联网 发布:大数据在传媒界的应用 编辑:程序博客网 时间:2024/05/01 03:01
Java线程同步
Java在处理线程同步时,首先要将修改数据的方法用关键字synchronized来修饰,之后,当一个线程A使用该方法时,其他线程想使用该方法时必须等待,直到线程A使用完该方法。
在特殊情况下,当一个线程使用的同步方法中用到的变量,需要其他线程修改后才能符合本线程的需要时,可以在同步方法中使用wait()方法,来中断同步方法的执行,使本线程等待,并允许其他线程使用这个同步方法。其他线程在使用完这个同步方法的同时,应当用notifyAll()方法通知所有由于该同步方法而等待的线程结束等待,并遵循“先中断先继续”的原则,从刚才中断处继续执行这个同步方法。使用notify()方法是只通知处于等待中的线程中的某一个结束等待。
错误示范
Example15_10.java
public class Example15_10 { public static void main(String[] args) { Thread threadOne,threadTwo; Bank1 bank=new Bank1(); threadOne=new Thread(bank); threadTwo=new Thread(bank); threadOne.setName("save"); threadTwo.setName("take"); threadOne.start(); threadTwo.start(); }}class Bank1 implements Runnable{ int money=0; String name; public void run(){ name=Thread.currentThread().getName(); if(name.equals("save")){ for(int i=1;i<=3;i++){ saveAndTake(30); System.out.println("休息一会再存"); try{Thread.sleep(2000); } catch(InterruptedException e){ } } } else if(name.equals("take")){ for(int i=1;i<=3;i++){ saveAndTake(20); System.out.println("休息一会再取"); try{Thread.sleep(2000); } catch(InterruptedException e){ } } } } public synchronized void saveAndTake(int j){ if(name.equals("save")){ money=money+j; System.out.println(Thread.currentThread().getName()); System.out.println("存入现金"+j+"元,卡上余额"+money+"元。"); } else if(name.equals("take")){ money=money-j; System.out.println(Thread.currentThread().getName()); System.out.println("取出存款"+j+"元,卡上余额"+money+"元。"); } }}输出结果为:save //首先进行存钱,线程save存入现金30元,卡上余额30元。//线程save的一次saveAndTake方法结束休息一会再存 //线程save开始sleeptake //线程take开始取出存款20元,卡上余额10元。//线程take的一次saveAndTake方法完成休息一会再取 //线程take开始sleepsave //继续线程save(此时全局变量name在进行第一次take取出存款30元,卡上余额-20元。//时被赋值为take,继续线程save时未重新赋休息一会再存 //值,故savaAndTake一直进行take取款操作)take取出存款20元,卡上余额-40元。休息一会再取take取出存款20元,卡上余额-60元。休息一会再取save取出存款30元,卡上余额-90元。休息一会再存
正确示例
Example15_10.java
public class Example15_101 { public static void main(String[] args) { Thread threadOne,threadTwo; Bank2 bank=new Bank2(); threadOne=new Thread(bank); threadTwo=new Thread(bank); threadOne.setName("save"); threadTwo.setName("take"); threadOne.start(); threadTwo.start(); }}class Bank2 implements Runnable{ int money=0; String name; public void run(){ name=Thread.currentThread().getName(); if(name.equals("save")){ saveAndTake(30); } else if(name.equals("take")){ saveAndTake(20); } } public synchronized void saveAndTake(int j){ if(name.equals("save")){ for(int i=1;i<=3;i++){ money=money+j; System.out.println(Thread.currentThread().getName()); System.out.println("存入现金"+j+"元,卡上余额"+money+"元。休息一会再存"); try{Thread.sleep(2000); } catch(InterruptedException e){ } } } else if(name.equals("take")){ for(int i=1;i<=3;i++){ money=money-j; System.out.println(Thread.currentThread().getName()); System.out.println("取出存款"+j+"元,卡上余额"+money+"元。休息一会再取"); try{Thread.sleep(2000); } catch(InterruptedException e){ } } } }}输出结果:save存入现金30元,卡上余额30元。休息一会再存 //线程save即使sleep,也save //不开始线程take,因方法存入现金30元,卡上余额60元。休息一会再存 //saveAndTake未循环完,save //(循环在方法内进行)存入现金30元,卡上余额90元。休息一会再存 //线程save三次循环结束take //线程take开始取出存款20元,卡上余额70元。休息一会再取take取出存款20元,卡上余额50元。休息一会再取take取出存款20元,卡上余额30元。休息一会再取
0 0
- Java线程同步示例
- Java 线程同步示例
- java线程同步示例
- Java线程同步示例
- java线程同步最基本的示例
- Java 2 入门经典(线程、线程同步示例代码)
- C# 线程同步示例
- 线程同步示例
- Java线程同步:生产者-消费者 模型(代码示例)
- Java线程同步中的wait()和notify()使用简单示例
- 线程同步的简单示例
- JAVA线程-JAVA同步
- Java线程:线程的同步-同步方法
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步方法
- Java线程:线程的同步-同步块
- Java线程:线程的同步-同步方法
- Java线程:线程的同步-同步方法
- 文件服务器-fastdfs
- 超简单将Centos的yum源更换为国内的阿里云源
- wsdl详解
- 常用CGI环境变量
- React源码分析4 — React生命周期详解
- Java线程同步示例
- java数组分析
- 解决adb not responding if youd like to retry...错误
- SQLServer 中发布与订阅
- ConcurrentHashMap总结
- 第十一讲项目四 玩数字
- 自定义函数名和命名空间存在的函数名同名的解决方法
- escape()、encodeURI()、encodeURIComponent()区别详解
- 安卓使用MediaPlayer和SurfaceView播放视频