java---教你怎么判断多线程是否安全
2015-10-04 23:40
1586 查看
多线程不安全,主要因为cpu分配机制,谁获得了cpu谁就能执行,因此造成了线程的不安全.
那么,如何找出问题呢?
1.明确哪些代码是多线程运行的代码,
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据.
根据以上三部.下面看例子,
很简单的例子,
首先第一步,找到多线程运行的代码
第二步,找到共享数据
第三步,明确多线程使用的共享数据.
首先对于数据b就一条语句使用了这个共享变量,因此不会出现线程不安全,但是对于sum,有两条语句使用的,所以就会出现线程安全问题,
解决办法,同步块
或者,同步函数
以上就是线程安全的解决办法,同步机制虽然游侠,但是带来了一定的性能损耗,所以,对操作共享数据的部分执行同步,尽量减少这种损耗
补充:
如果同步函数是静态的,那么使用的锁就必须是所在类的字节码文件对象,也就是 类名.class,解释来说,静态是和类一起加载的,所以在静态加载的时候是不可能有object的对象,所以锁就必须用在静态加在之前的一个对象.
版权声明:本文为博主原创文章,未经博主允许不得转载。
那么,如何找出问题呢?
1.明确哪些代码是多线程运行的代码,
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据.
根据以上三部.下面看例子,
package com.niuli.develop; public class Test { public static void main (String [] args) { Cus c = new Cus(); new Thread(c).start(); new Thread(c).start(); } } class Bank{ private int sum = 0; public void add(int n) { sum = sum + n; System.out.println("sum= "+sum); } } class Cus implements Runnable{ Bank b = new Bank(); @Override public void run() { for (int i = 0; i < 3; i++) { b.add(100); } } }
很简单的例子,
首先第一步,找到多线程运行的代码
也就是run方法里面的代码 for (int i = 0; i < 3; i++) { b.add(100); } 另外这里用到了Add方法,所以add也算 public void add(int n) { sum = sum + n; System.out.println("sum= "+sum); }
第二步,找到共享数据
Bank b = new Bank(); private int sum = 0;
第三步,明确多线程使用的共享数据.
首先对于数据b就一条语句使用了这个共享变量,因此不会出现线程不安全,但是对于sum,有两条语句使用的,所以就会出现线程安全问题,
解决办法,同步块
Object obj = new Object(); public void add(int n) { synchronized (obj) { sum = sum + n; System.out.println("sum= "+sum); } }
或者,同步函数
public synchronized void add(int n) { sum = sum + n; System.out.println("sum= "+sum); }
以上就是线程安全的解决办法,同步机制虽然游侠,但是带来了一定的性能损耗,所以,对操作共享数据的部分执行同步,尽量减少这种损耗
补充:
如果同步函数是静态的,那么使用的锁就必须是所在类的字节码文件对象,也就是 类名.class,解释来说,静态是和类一起加载的,所以在静态加载的时候是不可能有object的对象,所以锁就必须用在静态加在之前的一个对象.
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- SpringAOP嵌套调用的解决办法
- MyEclipse之各个版本的区别
- JAVA_SE基础——38.单例设计模式
- Eclipse之各个版本的区别
- java线程监控
- Eclipse快捷键
- eclipse创建maven项目
- JAVA基本框架搭建(Maven,jetty,Jod…
- SpringMVC could bind&n…
- 获取java项目根目录
- Eclipse 字符编码设置。
- SpringMVC 错误分析:@Autowi…
- java的几种对象(PO,VO,DAO,BO,POJO…
- JDK&JRE&JVM_跨平台特性_开发环境配置_dos命令_字符集JAVA001-006
- 在应用层通过spring特性解决数据库读写分离
- java synchronized详解
- Java多线程11:ReentrantLock的使用和Condition
- 在Spring中使用cache(EhCache的对象缓存和页面缓存)
- Spring MVC Cookie example
- Spring MVC Cookie example