关于Vector类的问题

Destroy_The_Code 2013-03-16 12:10:59
最近在看《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类的自己的所有可修改方法都使用内部锁”这个事实?
...全文
374 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Destroy_The_Code 2013-03-22
  • 打赏
  • 举报
回复
结贴,字数太少了......
Destroy_The_Code 2013-03-21
  • 打赏
  • 举报
回复
引用 8 楼 zhou9898 的回复:
达达KZT 2013-03-19
  • 打赏
  • 举报
回复
Destroy_The_Code 2013-03-18
  • 打赏
  • 举报
回复
引用 6 楼 yongger520 的回复:
引用 5 楼 Destroy_The_Code 的回复:引用 3 楼 yongger520 的回复: 内部锁 我的理解应该就是每个Vector内部的那个Object obj; 对每个Vector对象,都要先获得obj的锁 因为这个private Object obj放在Vector内部,且是私有的,所以叫内部锁 可是我在Vector类里面并没有发现有一个pr……
恩,你说的有道理。我在上面写的代码只是举个例子而已。
yongger520 2013-03-18
  • 打赏
  • 举报
回复
引用 5 楼 Destroy_The_Code 的回复:
引用 3 楼 yongger520 的回复: 内部锁 我的理解应该就是每个Vector内部的那个Object obj; 对每个Vector对象,都要先获得obj的锁 因为这个private Object obj放在Vector内部,且是私有的,所以叫内部锁 可是我在Vector类里面并没有发现有一个private Object类型的字段。我的JDK版本是jdk1.7.0_15。
晕 ,我以为你贴出来的是官方源代码 Vector的方法都用synchronize修饰了, 所谓内部锁就是Vector对象本身吧
Destroy_The_Code 2013-03-18
  • 打赏
  • 举报
回复
引用 3 楼 yongger520 的回复:
内部锁 我的理解应该就是每个Vector内部的那个Object obj; 对每个Vector对象,都要先获得obj的锁 因为这个private Object obj放在Vector内部,且是私有的,所以叫内部锁
可是我在Vector类里面并没有发现有一个private Object类型的字段。我的JDK版本是jdk1.7.0_15。
阿尔法捕手 2013-03-18
  • 打赏
  • 举报
回复
引用 3 楼 yongger520 的回复:
内部锁 我的理解应该就是每个Vector内部的那个Object obj; 对每个Vector对象,都要先获得obj的锁 因为这个private Object obj放在Vector内部,且是私有的,所以叫内部锁
good!
yongger520 2013-03-18
  • 打赏
  • 举报
回复
内部锁 我的理解应该就是每个Vector内部的那个Object obj; 对每个Vector对象,都要先获得obj的锁 因为这个private Object obj放在Vector内部,且是私有的,所以叫内部锁
Destroy_The_Code 2013-03-18
  • 打赏
  • 举报
回复
引用 1 楼 wangheshiniye 的回复:
楼主大概就是您所写的 Vector类是版本很低的 应该是jdk1.0 默认是由内部锁的有了内部锁 多线程访问时就不会出现并发问题 因为内部锁的作用就是在某时刻只能有一个线程访问 其他的线程只能排队等待 当然你写的有点问题 因为县城每次进来都会判断内部锁 这样很费时间 事实上Vector内部是这样的: public class Vector<E> { pri……
谢谢你回答了我第二个问题,请问第一个问题:“内部锁”到底是什么?
wangheshiniye 2013-03-17
  • 打赏
  • 举报
回复
楼主大概就是您所写的 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 而不会判断所 这样节约资源和时间

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧