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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 奋斗2013 中级黑马   /  2013-4-1 20:17  /  1672 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 奋斗2013 于 2013-4-6 15:47 编辑

今天学习了线程同步方法:其中有一个方法是同步块减负:代码如下:

public class SynchronizedBlockDemo implements Runnable {
   
    private int number = 0;// 创建一个int类型变量进行测试
   
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(100);// 线程休眠0.1秒增加出错几率
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (this) {
                // 输出当前线程的名称和number的值,每次循环之后number的值都会加一
                System.out.println(Thread.currentThread().getName() + ": "
                        + number++);
            }
        }
    }
   
    public static void main(String[] args) {
        SynchronizedBlockDemo run = new SynchronizedBlockDemo(); // 获得SynchronizedBlockDemo
                                                                 // 对象
        Thread thread1 = new Thread(run);// 创建线程1
        Thread thread2 = new Thread(run);// 创建线程2
        thread1.start();// 运行线程1
        thread2.start();// 运行线程2
    }
}
其中这段代码
synchronized (this) {
                // 输出当前线程的名称和number的值,每次循环之后number的值都会加一
                System.out.println(Thread.currentThread().getName() + ": "
                        + number++);
            }

我只知道他是线程同步的,不知道他实现同步的原理。他是怎样保证线程同步的呢?请懂的讲解一下。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
  当第一个线程运行到这行代码时候    synchronized (this) 运行里面的代码,就锁住了,别的线程进不来。当他运行完之后,第二个线程再接着进去,同步代码块保证的线程同步吧。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油~

查看全部评分

回复 使用道具 举报
我记得毕老师讲线程同步的时候有两个条件,是否是两个或者两个以上的线程,是否是使用的同一个锁。你new了两个线程,第一个条件满足了,第二个条件
我虽然不知道java源代码是怎么实现,但是根据我的理解,是否是同一把锁,主要是看synchronized括号里传进来的参数,只要是里面是同一个对象就是同一把锁,SynchronizedBlockDemo类中持有一个this引用,并且你只new了一个SynchronizedBlockDemo对象所以是同一把锁,从而保证了线程同步。synchronized参数还可以传递,SynchronizedBlockDemo.class或者new一个Object对象吧对象传进去,只要保证是同一个对象就行了。锁内部有个状态,如果拿0表示打开,1表示关闭。锁的默认状态是0,当有一个线程进入同步代码块中,锁的状态就变成了1,当另一个线程执行到同步代码块的时候,看到锁的状态是1,就会等待。当同步代码块中的线程执行完毕后,锁的状态变成0,等待的线程就能进来了,锁的状态就会又变成1.这是我的个人理解,仅供参考。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问; 没有的话,改成【已解决】哦~
回复 使用道具 举报
synchronized (this) {
                // 输出当前线程的名称和number的值,每次循环之后number的值都会加一
                System.out.println(Thread.currentThread().getName() + ": "
                        + number++);
            }
当一个线程执行到这个方法时就会上锁,别的线程就算拿到执行权也不能进入执行,只有第一个线程执行完并解锁后其他线程才能有机会进入。这就保证了同一个资源
一次只有一个线程进行操作。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马