黑马程序员技术交流社区

标题: 为什么线程锁不管用? [打印本页]

作者: 362688114    时间: 2014-5-9 16:22
标题: 为什么线程锁不管用?
  1. public class threadAndRunnable {

  2.         public static void main(String[] args) {
  3.                 ticket tic=new ticket(); //创建线程对象
  4.                
  5.                 Thread t1=new Thread(tic);
  6.                 Thread t2=new Thread(tic);
  7.                 Thread t3=new Thread(tic);
  8.                
  9.                 t1.start(); //启动线程
  10.                 t2.start();
  11.                 t3.start();
  12.         }
  13. }


  14. //实现接口创建线程
  15. class ticket implements Runnable //extends Thread
  16. {

  17.         private int tic=200;
  18.         @Override
  19.         public void run() { //重写Run方法
  20.                 while(true){
  21.                         synchronized (new Object()) {  //给线程上锁
  22.                                 if(tic>0){
  23.                                         try {
  24.                                                 Thread.sleep(10); //线程冻结状态
  25.                                                 System.out.println(Thread.currentThread().getName()+"---tic:"+tic--);
  26.                                         } catch (InterruptedException e) {
  27.                                                 e.toString();
  28.                                         }
  29.                                 }
  30.                         }
  31.                 }
  32.         }
  33.        
  34. }
复制代码
给线程加了锁,但还是出现0或负值的情况,怎么回事?!!


作者: 月光海    时间: 2014-5-9 16:26
你这每启动一个线程就新创建了一个锁,每个线程的锁都不一样,当然不会管用了
作者: 彭飞    时间: 2014-5-9 16:33
本帖最后由 彭飞 于 2014-5-9 16:34 编辑

每一次都是new的一个新锁, 当然是不阔以的拉。

把你上的锁,改成 this。
synchronized (new Object()) {  //给线程上锁  改为:
                                    synchronized (this) {  //给线程上锁

测试安全。
建议继续看视频。
其实学习synchronized 只是一种过度,后面会讲解最新的加锁方式。
不过也要理解前面的东西,呵呵。
作者: 曹冬明    时间: 2014-5-9 16:33
貌似3个线程用的都是不同的锁,所以才会那样,你只要在类中定义一个Object obj  = new Object();然后把那个synchronized后面括号里改成obj就可以了
作者: 曹冬明    时间: 2014-5-9 16:34
月光海 发表于 2014-5-9 16:26
你这每启动一个线程就新创建了一个锁,每个线程的锁都不一样,当然不会管用了 ...

哥们,你报的哪期啊,我上个月逛论坛的时候就总看到你,流程走完了么
作者: 月光海    时间: 2014-5-9 17:04
曹冬明 发表于 2014-5-9 16:34
哥们,你报的哪期啊,我上个月逛论坛的时候就总看到你,流程走完了么

我想报36的,还没开始,上个月就是弄点分
作者: 362688114    时间: 2014-5-9 18:55
月光海 发表于 2014-5-9 16:26
你这每启动一个线程就新创建了一个锁,每个线程的锁都不一样,当然不会管用了 ...

一语道破。
作者: 362688114    时间: 2014-5-9 18:59
彭飞 发表于 2014-5-9 16:33
每一次都是new的一个新锁, 当然是不阔以的拉。

把你上的锁,改成 this。

谢了哥们/
作者: sheng6699    时间: 2014-5-10 09:25
三个线程分别进来后  创建了三个锁。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2