日期:2014-05-20  浏览次数:20869 次

关于Vector类的问题
最近在看《JAVA2核心技术》的多线程一章,P647写道:

引用
我们可以截获这个锁:

public void transfer(Vector<Double> accounts,int from,int to,int amount)
{
    synchronized(accounts)
    {
        accounts.set(from,accounts.get(from)-amount);
        accounts.set(to,accounts.get(to)+amount);
    }
    System.out.println(...);
}

这个方法可以工作,但是它完全依赖于这样一个事实,Vector类的自己的所有可修改方法都使用内部锁。


①如何理解“使用内部锁”?是要像如下写法吗:

public class Vector<E>
{
    private Object obj;
    public void method_1()
    {
        synchronized(obj)   //这个就是所谓“使用内部锁”?
        {
            ...
        }
    }
}


②为什么要依赖于“Vector类的自己的所有可修改方法都使用内部锁”这个事实?
java?内部锁? vector java 多线程 内部锁

------解决方案--------------------
楼主大概就是您所写的 Vector类是版本很低的 应该是jdk1.0  默认是由内部锁的有了内部锁 多线程访问时就不会出现并发问题 因为内部锁的作用就是在某时刻只能有一个线程访问 其他的线程只能排队等待 当然你写的有点问题 因为县城每次进来都会判断内部锁 这样很费时间 事实上Vector内部是这样的:
public class Vector<E>
{
    private Object obj;
private boolean flag = true;
    public void method_1()
    {
if(flag){
       synchronized(obj)   //这个就是所谓“使用内部锁”?
        {
flag=false;
            ...
flag=true;
        }
}
    }
}
这样每次都会判断flag 而不会判断所 这样节约资源和时间
------解决方案--------------------
内部锁 我的理解应该就是每个Vector内部的那个Object obj; 
对每个Vector对象,都要先获得obj的锁
因为这个private Object obj放在Vector内部,且是私有的,所以叫内部锁
------解决方案--------------------
引用:
引用:
内部锁 我的理解应该就是每个Vector内部的那个Object obj; 
对每个Vector对象,都要先获得obj的锁
因为这个private Object obj放在Vector内部,且是私有的,所以叫内部锁

可是我在Vector类里面并没有发现有一个private Object类型的字段。我的JDK版本是jdk1.7.0_15。


晕 ,我以为你贴出来的是官方源代码
Vector的方法都用synchronize修饰了,
所谓内部锁就是Vector对象本身吧