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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山水游客 中级黑马   /  2012-6-3 23:00  /  1809 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

简易买票程序,代码如下
public class ThreadANDRunnable
{

public static void main(String[] args)
{

  thread tt = new thread();
  new Thread(tt).start();
  new Thread(tt).start();
  new Thread(tt).start();
  new Thread(tt).start();
  
}
}
class thread implements Runnable
{

int  tickets = 100;

String str  = new String("");



public void run()
{

  while (true)
  {
   
    synchronized (str)
    {
   if (tickets > 0)
   {
    try
    {
     Thread.sleep(10);
    }
    catch (Exception e)
    {
     // TODO: handle exception
    }
    System.out.println(Thread.currentThread().getName() + " is salling" + tickets--);
   }
   
   }
   
  }
  
}
}
请问大家定义String str  = new String("");和  synchronized (str)有着什么直接的关系,synchronized的运行机制是什么?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
这里应该没什么直接联系,synchronized操作只是需要传一个对象而已,你这里不用str,用个什么Thread.class效果其实是一样的,就相当于一把锁,只要能锁门的,什么锁都可以。
回复 使用道具 举报
synchronized  需要锁,这个锁可以是任意对象。 String str  = new String("");  就创建了一个String对象str作为线程同步的锁。
synchronized的运行机制是什么?
就是被同步的代码,一个线程没有执行完,其他线程不能去执行。
整个恶心的加深印象。
比如你去上厕所, 进去之后看见厕所还有纸,开始上厕所。上到一半,有事就去处理事去了(哈哈,恶心吧)。回来就继续上,终于搞定,突然发现你走的时候别人进来了,把纸给用了,这个时候你就头大了。
加了同步就不一样了,你进去直接把门锁住,你上厕所到一半有事的时候,有事去处理,走的时候加还把门锁住,别人谁也进不来,动不了你的纸,处理完事你回来继续上完你的厕所,不会出问题。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 支持原创,不过比喻该改一下

查看全部评分

回复 使用道具 举报
1、synchronized  ,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
2、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
3、关于参数问题:毕老师在他的视频用到的代码是synchronized (obj),synchronized (this),synchronized (Ticket.class),意思是保证参数的唯一性,才能保证锁的唯一性,才能保证线程的安全
4、而参数问题一般情况下都用this,代表当前类对象,如果同步代码块方法被static化,则用类名.class,其实还是表示当前类
  1. public void run()
  2.         {
  3.                 if(flag)
  4.                 {
  5.                         while(true)//作循环用
  6.                         {
  7.                                 synchronized(Ticket.class)//this 以后,跟下面的synchronized用同一个锁
  8.                                 {
  9.                                                 if (ticket>0)
  10.                                         {
  11.                                                 try{Thread.sleep(10);}catch(Exception e){}
  12.                                                 System.out.println(Thread.currentThread().getName()+"...run.."+ticket--);
  13.                                         }
  14.                                 }
  15.                         }
  16.                 }
  17.                 else
  18.                         while(true)
  19.                                 show();
  20.         }
  21.         public static synchronized void show()
  22.         {
  23.                 if (ticket>0)
  24.                         {
  25.                                 try{Thread.sleep(10);}catch(Exception e){}
  26.                                 System.out.println(Thread.currentThread().getName()+"...show.."+ticket--);
  27.                         }
  28.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黄克帅 发表于 2012-6-3 23:27
synchronized  需要锁,这个锁可以是任意对象。 String str  = new String("");  就创建了一个String对象st ...

Synchronized是门,str是锁,你一出门的话,锁会自然被释放的,锁是在里面开和关,你进去锁上了,别人进不去,你一出来你也不可能把门锁上,所以你比喻的出去做事情了不怎么恰当,所以你可以说:蹲着蹲着就在里面睡着了。:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马