线程安全性问题---->同步代码块
2015-12-09 00:00
246 查看
线程安全性问题产生的原因:
---->有多个线程在操作共享数据。
当一个线程在执行操作共享数据的多条代码过程中,其他线程也参与了运算。就会导致线程安全问题产生。
解决思路:
将多条操作共享数据的线程代码 封装起来,当有线程在执行这些代码的时候,其他线程不参与运算
必须当前线程把这些代码执行完毕后,其他线程才可以运算。
在java中使用同步代码块解决此问题
同步代码块格式:
synchronized(对象)
{需要被同步的代码}
同步代码块的好处:解决了线程的安全性问题
同步代码块的弊端:相对降低了效率,因为同步外的线程都会判断同步锁
需求:两个 储户,到一个银行存钱,每次存100 各存 3 次
---->有多个线程在操作共享数据。
当一个线程在执行操作共享数据的多条代码过程中,其他线程也参与了运算。就会导致线程安全问题产生。
解决思路:
将多条操作共享数据的线程代码 封装起来,当有线程在执行这些代码的时候,其他线程不参与运算
必须当前线程把这些代码执行完毕后,其他线程才可以运算。
在java中使用同步代码块解决此问题
同步代码块格式:
synchronized(对象)
{需要被同步的代码}
同步代码块的好处:解决了线程的安全性问题
同步代码块的弊端:相对降低了效率,因为同步外的线程都会判断同步锁
package org.panda.Thread; public class TicketDemo02 { public static void main(String[] args) { Ticket t = new Ticket() ; //实例化Ticket对象 Thread t1 = new Thread(t) ; Thread t2 = new Thread(t) ; t1.start(); t2.start(); } } class Ticket1 implements Runnable { private int num = 100 ; //声明类的属性,并赋值 public void run() //覆盖run()方法,封装线程任务 { while(true) { synchronized(this)//同步代码块,对当前对象进行同步 this表示当前对象 { if(num>0) { try { Thread.sleep(10); //增加延迟 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"...sale..."+(num--)); } } } } }
需求:两个 储户,到一个银行存钱,每次存100 各存 3 次
package org.panda.Thread; public class SaveMoneyDemo01 { public static void main(String[] args) { Cons c = new Cons() ; Thread t1 = new Thread(c) ; Thread t2 = new Thread(c) ; t1.start(); t2.start(); } } class Bank //创建银行类 { private int sum ; //定义类属性 表示总数 public synchronized void add(int num) //同步函数 { sum = sum + num ; //求出累加和 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("sum= "+sum); } } class Cons implements Runnable { private Bank b = new Bank() ; //实例化Bank对象 public void run() { for(int i=0;i<3;i++) { b.add(100); //调用银行方法每次存款100 } } }
相关文章推荐
- eclipse之debug找不到源
- php扩展ImageMagick图片库处理扩展
- 在Ruby on Rails项目中用tesseract ocr读取图片上文字
- Java中字节与十六进制的转换
- python条件、循环和其他语法
- Go interfaces make test stubbing easy
- Why Go Is Not Good
- GitHub 排名前 100 的项目
- python时间戳转换
- 输出drools规则文件对应的java代码
- 设计模式----迭代器模式UML和实现代码
- 设计模式----观察者模式UML和实现代码(5个必须掌握的设计模式)
- javamail正文乱码
- eclipse使用技巧汇总
- vs c++配置项目
- openstack,rf,python杂记
- UBUNTU上使用GIT和GITHUB
- Java基础_02
- Java基础_03
- Java基础_04