Android Java 并发程序系列----你应该知道的线程二

来源:互联网 发布:java jdk1.6 32位 编辑:程序博客网 时间:2024/06/05 20:53

接着上篇没有说完的博文继续,我们来谈谈线程的基础操作:(其实很多东西都是一搜一堆,这里我都尽量说的简单点)
wait和notify:这个大家可以看看这个博文http://blog.csdn.net/hudashi/article/details/7001070;

suspend和resume:这是两个要被废弃的方法了,主要原因就是挂起的线程不会释放锁,必须要被resume唤醒,用处不大,不推荐使用,此处略微提一下

**join和yield:**join,就是加入的意思,线程A执行到某个地方,可能需要线程B配合,那么线程B可能还在做他自己的任务,这时候A线程里面调用B.join(),那么A线程就会等B线程执行完了再继续走。
至于yield:当某线程调用yield的时候,他会释放他自己的资源,让别的线程有机会获得资源执行,但是,他释放了资源不代表他不会再次获得资源,也就是说,我发个红包,可能最后还是我自己抢了。。。

synchronize关键字:这算啥老生常谈了,这是最简单的保证线程安全和线程同步的办法,并且能保证可见性和保证有序性,不过弊端就是性能开销比较大。。

说了这么多相信对于很多人是没有一点收获的,那么下面我们来看看一个错误 synchronize 的用法吧。。。

 public static void main(String[] args) {        Thread addThread1 = new Thread(new AddTask());        Thread addThread2 = new Thread(new AddTask());        addThread1.start();        addThread2.start();        try {            addThread1.join();            addThread2.join();            System.out.println("我们期望的值是:2000 实际是:"+AddTask.num);        } catch (InterruptedException e) {            e.printStackTrace();        }    }    static class AddTask implements Runnable {        public static Integer num = 0;        @Override        public void run() {            for (int i1 = 0; i1 < 1000; i1++) {                synchronized (num){                    num++;                }            }        }    }

上面這段代码运行的结果是一个远远小于2000的数值,这段看起来没有问题的代码问题在什么地方呢?其实如果你认真看看编译器的提示,是可以发现这么一段话的 “synchronize on a non-final field ‘num’”,其实就是告诉我们一个integer是一个不可被修改对象,每次 ++ 其实都是一个不同的对象,那么 你这个锁其实。。。木有卵用。。。因为你加锁的对象其实一直都在变。

到这里,线程基础知识就不准备在赘述了,毕竟都不是初学者,这些简单的东西 ,就当热热身,下篇博文应该就是正式进入我们这系列的主题,并发编程了。。。

0 0
原创粉丝点击