A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© CrazyProgram 中级黑马   /  2013-4-24 16:49  /  1893 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 CrazyProgram 于 2013-4-26 20:11 编辑
  1. package zhiwei.deng.web.listener;

  2. import java.util.HashMap;
  3. import java.util.Map;

  4. import javax.servlet.ServletRequestEvent;
  5. import javax.servlet.ServletRequestListener;
  6. import javax.servlet.http.HttpServletRequest;

  7. public class VisitorListener implements ServletRequestListener {
  8. private int num;
  9. private static Map<String,String> map = new HashMap<String,String>();
  10. static{
  11. map.put("127.0.0.1", "中国北京");
  12. }

  13. public void requestInitialized(ServletRequestEvent sre) {
  14. //锁住大家共享的东西
  15. synchronized(this){//这个this代表的是什么,我打印了这个类的hashcode还想不是他~给个答案谢谢
  16. num++;
  17. }
  18. HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
  19. //设置得到ip
  20. String ip = request.getRemoteAddr();
  21. request.setAttribute("ip", ip);
  22. //设置得到地址
  23. String address = map.get(ip);
  24. if(address==null){
  25. address = "中国深圳";
  26. }
  27. request.setAttribute("address", address);
  28. }
  29. public void requestDestroyed(ServletRequestEvent sre) {

  30. }

  31. }
复制代码
很久没想这个问题了,今天突然发现有点不对。。求解释
19行不理解的地方在那

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

10 个回复

倒序浏览
this关键字
this就代表了本身这个类
回复 使用道具 举报
这里的this就代表这个类对象本身。
因为他前面用了synchronized,所以这个对象在进行方法块内的运算时别人是不能拿到的。确保了线程间的安全性。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
多线程的同步锁通过synchronized实现有俩种方式 一种是在代码块加锁,代码块加锁时可以指定任意类的实例过的对象即锁在这个对象上(任何对象都有一个锁)使同一时间内只有一个线程可以访问到代码块中。另外一种就是以synchronized关键字修饰方法这时加锁的对象就是类本身的实例 即this。而你此处的this其实就是你这个类本身的实例对象。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
harborbest 发表于 2013-4-24 17:14
多线程的同步锁通过synchronized实现有俩种方式 一种是在代码块加锁,代码块加锁时可以指定任意类的实例过 ...

VisitorListener.class.hashcode();这个跟this.hashcode()不是一样的,,为什么?
回复 使用道具 举报
CrazyProgram 发表于 2013-4-24 20:46
VisitorListener.class.hashcode();这个跟this.hashcode()不是一样的,,为什么?

VisitorListener.class这是一个字节码对象,而this代表的是你当前的对象,一个类只能有一个字节码类对象,但是可以new()很多个对象。this是你现在的对象!所以hashcode()肯定不一样,个人理解!希望指正!
回复 使用道具 举报
这里的this代表的当前对象   哪个对象执行此语句就是哪个对象  和其它语句中的this用法是一样的  
回复 使用道具 举报
this代表调用requestInitialized这个方法的对象。
回复 使用道具 举报
synchronized用于解决多线程的安全问题,格式synchronized(对象){} ,这个对象可以使任意的。函数需要被对象调用,那么函数都有一个所属对象引用,就是this

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
this:看上去,是用于区分局部变量和成员变量同名情况。代表本类的对象,this代表它所在函数所属对象的引用。简单说:哪个对象在调用this所在的函数,this就代表哪个对象。
this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。但凡本类功能内部使用了了本类对象,都用this表示。
synchronized中的this是使线程同步,保证多线程操作数据的唯一性。
回复 使用道具 举报
楼主如果明白了,把帖子的类型改为“已解决” {:soso_e181:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马