新写了一个Java并发程序设计教程

新写了一个Java并发程序设计教程, 用于公司内部培训的,和2007年写的那个相比,内容更翔实一些。

内容列表

1、使用线程的经验:设置名称、响应中断、使用ThreadLocal

2、Executor :ExecutorService和Future ☆ ☆ ☆
3、阻塞队列 : put和take、offer和poll、drainTo
4、线程间的协调手段:lock、condition、wait、notify、notifyAll ☆ ☆ ☆
5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList ☆ ☆ ☆
6、关于锁使用的经验介绍
7、并发流程控制手段:CountDownlatch、Barrier
8、定时器: ScheduledExecutorService、大规模定时器TimerWheel
9、并发三大定律:Amdahl、Gustafson、Sun-Ni
10、神人和图书
11、业界发展情况: GPGPU、OpenCL

12、复习题

 

 

下载地址:

 2010-10-10版

http://files.cnblogs.com/jobs/Java%e5%b9%b6%e5%8f%91%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e6%95%99%e7%a8%8b-2010-08-10.pdf 

 

 

欢迎看了之后写反馈给我。

 

博客园的文章地址:

http://www.cnblogs.com/jobs/archive/2010/07/29/1788156.html

 

posted on 2010-07-29 18:34 温少 阅读(2846) 评论(14) 编辑 收藏

评论

#1楼  回复 引用 查看   

如博主所想,您做的事情的确对我们有所帮助,谢谢。
2010-07-30 13:39 | Mr.chenz      

#2楼  回复 引用 查看   

good
2010-08-03 16:41 | huhu429      

#3楼  回复 引用 查看   

cocurrent编程要比synchronized编程门槛要高一些,本人还是对大家是否能够用好并发编程有一些忧虑,希望通过更多的实践能搞逐渐提高大家的编程水平。
public class classBlockingQ
{
    private Object notEmpty= new Object();
    private Queue<Object> linkedList= new LinkedList<Object>();
    public Object take() throws InterruptedException
    {
        synchronized(notEmpty) 
        {
            if(linkedList.size() == 0) 
            {
                notEmpty.wait();
            }
            return linkedList.poll();
        }
    }
    public void offer(Object object) 
    {
        synchronized(notEmpty) 
        {
            if(linkedList.size() == 0) 
            {
                notEmpty.notifyAll();
            }
            linkedList.add(object);
        }
    }
}


在这个例子中,如果先有两个线程调用take,并进入wait状态,然后第三个线程调用offer,会有什么样的结果?将有一个take()返回null,是否是设计期望的?
2010-09-08 06:54 | synchronized      

#4楼  回复 引用 查看   

public class BlockingQ
{
    private Object notEmpty = new Object();
    private Object notFull = new Object();
    private Queue<Object> linkedList = new LinkedList<Object>();
    private int maxLength = 10;
    public Object take() throws InterruptedException
    {
        synchronized (notEmpty)
        {
            if (linkedList.size() == 0)
            {
                notEmpty.wait();
            }
            synchronized (notFull)
            {
                if (linkedList.size() == maxLength)
                {
                    notFull.notifyAll();
                }
                return linkedList.poll();
            }
        }
    }
    public void offer(Object object) throws InterruptedException
    {
        synchronized (notEmpty)
        {
            if (linkedList.size() == 0)
            {
                notEmpty.notifyAll();
            }
            synchronized (notFull)
            {
                if (linkedList.size() == maxLength)
                {
                    notFull.wait();
                }
                linkedList.add(object);
            }
        }
    }
}


在这个例子中,如果offer时linkedList.size()==maxLength,进入notFull.wait,它只释放了notFull的同步锁,并未释放notEmpty的同步锁。在它退出之前,所有其他线程调用take和offer都会产生死锁。
2010-09-08 07:06 | synchronized      

#5楼  回复 引用 查看   

在“实现一个简单的阻塞队列(3)”这个例子中同样会出现take返回null的问题
2010-09-08 07:17 | synchronized      

#6楼  回复 引用 查看   

此外,在你的例子中,还有一些值得探讨的话题,
比如说BeanManager这个例子中,如果createBean是一个比较耗时的操作,在同步快里执行效率低或者用putIfAbsent会产生重复的调用,该怎么解决?
CopyOnWriteArrayList用于Listeners时每次add都创建新的数组,是否有此必要?

ScheduledExecutorService的实现比较适合精确定时,但它的remove方法是简单遍历的,这对它适用的场合就有了很大的限制。而TimerWheel的算法是否能适合精确定时?这两种算法如何比较?
2010-09-08 07:40 | synchronized      

#7楼[楼主]  回复 引用 查看   

@synchronized
1、你说的BeanManager的情况,一般是采用Proxy类来解决。
2、CopyOnWriteArrayList虽然是修改的时候速度不快,但是读取没有任何额外的开销。
3、TimerWheel是需要指定一个固定的时间精度的
2010-09-09 01:47 | 温少      

#8楼[楼主]  回复 引用 查看   

@synchronized
3楼的例子没问题
4楼的例子的在你说的情况确会出现死锁,这个例子只是用来说明为什么需要用Lock、condition。
2010-09-09 01:53 | 温少      

#9楼  回复 引用 查看   

3楼的例子没问题是指不会返回null,还是返回null是允许的?
2010-09-11 23:48 | synchronized      

#10楼[楼主]  回复 引用 查看   

@synchronized
你说的是对的,3楼的例子有问题,notifyAll是不对的,应该notify才对。最近很忙,很少上来,所以回复慢了,抱歉 :)
2010-11-11 00:12 | 温少      

#11楼  回复 引用 查看   

学习了
2011-10-29 11:50 | 繁星皓月      

#12楼  回复 引用 查看   

@synchronized
我觉得这个程序有点小问题,
synchronized (notEmpty)
{
if (linkedList.size() == 0)
{
notEmpty.wait();
}
return linkedList.poll();
}
这个部分中应该将if改成while,不知道我理解的对不对?
2011-11-03 16:15 | weagle      

#13楼  回复 引用 查看   

CAS应该是Compare-and-swap 吧 ?
2011-12-08 16:20 | Java:HelloWorld      

#14楼  回复 引用 查看   

CAS应该是Compare-and-swap
2011-12-16 19:48 | 张蒙蒙