注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

java 多线程(一)  

2015-07-03 11:37:14|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前端时间搞了一个新闻app,需要从网上下载数据,然后实时保存到本地sqlite,然后页面部分从本地读取,部分从网络获取。涉及到到多线程,以及数据库同步读写问题。之前只会单线程访问下网络,读取下数据库,没怎么接触过多线程,然后查资料恶补,然后写下这几天的一些心得。
首先讲下概念问题。采用多线程是为了提高程序性能问题,比如我同时访问10个新闻栏目,不可能等第一个栏目加载完成,然后加载第二个,第三个....我希望10个栏目同时加载。我们常说的线程同步是为了解决多线程引起的同步问题。比如ATM取钱问题,账户中有1000块钱,A取走100,B存入100,正常逻辑是账户还有1000-100+100=1000元钱。现在有这么个问题,A取100的时候,B同时存入100,这时B读取到账户余额还是1000元钱(因为A还没取走钱),然后A取走了100,更新银行数据库账户余额变成900,接着B存入100,那结果就是
1000+100=1100,然后同步到银行数据库,结果账户余额还有1100。
出现上面问题的原因是AB同时对一个账户操作,在各自操作以后,没有更新对方的数据,或者说在各自操作时,去确认下服务端或者对方手中的数据是否一致。
多线程一般会出现2个问题。
1、多线程引起的顺序问题
class hello extends Thread {
 
    public hello() { 
    }
 
    public hello(String name) {
        this.name = name;
    }
 
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + "运行     " + i);
        }
    }
 
    public static void main(String[] args) {
        hello h1=new hello("A");
        hello h2=new hello("B");
        h1.start();
        h2.start();
    } 
    private String name;
}

【运行结果】:

A运行     0

B运行     0

B运行     1

B运行     2

B运行     3

B运行     4

A运行     1

A运行     2

A运行     3

A运行     4

这和我们预期希望输出结果A1-5,B1-5有出入。

分析】:由于AB线程同时执行,在A线程for(i=0)时,B线程就先执行for(i=1-5)了,计算机可不会等A线程全部执行完,然后再去执行B线程


2、多线程作用于同一个变量

//输出结果 55

public class Count {
private int num;
public void count() {
for(int i = 1; i <= 10; i++) {
num += i;
}
System.out.println(Thread.currentThread().getName() + "-" + num);
}
}

然后我想用10个线程输出10次55

public class ThreadTest {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
Count count = new Count();
public void run() {
count.count();
}
};
for(int i = 0; i < 10; i++) {
new Thread(runnable).start();
}
}
}

【运行结果】:

Thread-0-55
Thread-1-110
Thread-2-165
Thread-4-220
Thread-5-275
Thread-6-330
Thread-3-385
Thread-7-440
Thread-8-495
Thread-9-550

分析】:由于10个线程同时作用于Count的一个变量num,跟上面的ATM取钱问题差不多


以上例子都取自网络,支持正版
  评论这张
 
阅读(32)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018