java 线程六-解决线程安全隐患问题-加锁
2016-05-09 23:01
525 查看
需求:
银行有一个金库
有两个储户分别存300元,每次存100,共存三次。
目的:判断该程序是否有安全问题,如果有该怎么解决?
如何找出安全隐患?
1,明确哪些代码是多线程运行代码。
2,明确共享数据。
3,明确多线程运行代码中哪些是操作共享数据的。
*/
/*
解决线程安全隐患问题,有两种方法:
1,使用synchronized(对象){同步代码块}
2,使用同步函数,即用synchronized来修饰函数,达到同步的目的。
银行有一个金库
有两个储户分别存300元,每次存100,共存三次。
目的:判断该程序是否有安全问题,如果有该怎么解决?
如何找出安全隐患?
1,明确哪些代码是多线程运行代码。
2,明确共享数据。
3,明确多线程运行代码中哪些是操作共享数据的。
*/
/*
解决线程安全隐患问题,有两种方法:
1,使用synchronized(对象){同步代码块}
2,使用同步函数,即用synchronized来修饰函数,达到同步的目的。
class Bank { private int sum; //Object obj=new Object(); public synchronized void add(int x) { //synchronized(obj) //{ try { Thread.sleep(10); } catch (InterruptedException e) { } sum=sum+x; System.out.println("sum"+sum); //} } } class Cus implements Runnable { private Bank b=new Bank(); public void run() { for(int i=0;i<3;i++) { b.add(100); } } } class BankDemo { public static void main(String[] args) { Cus c=new Cus(); Thread t1=new Thread(c); Thread t2=new Thread(c); t1.start(); t2.start(); //System.out.println("Hello World!"); } }
/* 当有多个生产者和消费者时: 1,需要使用while循环判断资源生产标识,是可生产的状态还是可取的状态。 2,需要使用notifyAll来唤醒所有线程,否则如果使用notify的话,会出现所有线程都等待(wait())的情况,程序一直等待,不再运行下去。 */ class Resource { private String name; private int num=0; boolean flag; public synchronized void set(String name) { //if(flag) while(flag) try { this.wait(); } catch (Exception e) { } this.name=name+"_"+num++; System.out.println(Thread.currentThread().getName()+"生产者"+this.name); try { Thread.sleep(10); } catch (Exception e) { } flag=true; //this.notify(); this.notifyAll(); } public synchronized void get() { //if(!flag) while(!flag) try { this.wait(); } catch (Exception e) { } System.out.println(Thread.currentThread().getName()+"消费者.............."+this.name); flag=false; //this.notify(); this.notifyAll(); } } class Producer implements Runnable { private Resource r; Producer(Resource r) { this.r=r; } public void run() { while (true) { r.set("商品"); } } } class Consumer implements Runnable { private Resource r; Consumer(Resource r) { this.r=r; } public void run() { while (true) { r.get(); } } } class ProducerConsumerDemo { public static void main(String[] args) { Resource r=new Resource(); Producer p=new Producer(r); Consumer c=new Consumer(r); Thread t1=new Thread(p); Thread t2=new Thread(p); Thread t3=new Thread(c); Thread t4=new Thread(c); t1.start(); t2.start(); t3.start(); t4.start(); System.out.println("Hello World!"); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树