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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈志强 中级黑马   /  2013-3-18 18:18  /  1252 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师基础学习视频第12天

毕老师在讲该实例的过程中,就是讲多个线程参与生产和消费的运算设定了4个线程,1,2为生产线程,3,4为消费线程,在刚开始为生产和消费度为一个的时运行不会出错,但是当多个线程同时运算的时候就会出现问题,这个时候已经实现了标记的同步锁,并唤醒对方线程进行运算,所以这是多个线程参与运算的时候,在讲解时,老师讲在1线程运算完之后就将标记改为true,同时激活其他的线程,如果是3线程抢到了执行资格的时候就会执行消费线程,倘若是2线程抢到了执行权,就会在1线程后面停止运行,并释放执行权……

这个时候就会有个疑问,在此之前老师在讲单列设计模式,也就是懒汉式的时候也是讲了同步锁,这个时候说同步的锁会进行线程的加载,但是运行的效率会低,因为在进行线程的运行的时候就会在同步这里进行一次判断,如果这个时候程序里面有语句在运行就不执行想要执行的程序,也就是将线程里的线程处理完之后,同步锁才会解锁,才会讲线程放进,那么问题就是在线程2执行的时候,是不是会判断线程1是否在执行中,如果是2线程就在同步锁之外,直到线程1执行完之后,或者线程1在True的情况下,消费中的 一个进程就会执行,在消费中也会进行同样的判断,可是为何还是会出现问题呢?

这是该如何解释呢?

那么Synchorized到底代表的是什么呢?
谢谢

点评

如果你的问题得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢  发表于 2013-3-18 20:58

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

2 个回复

倒序浏览
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
1. synchronized 方法:
声明是为了定义变量的作用范围和作用域
通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。
2. synchronized 块:
通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

对synchronized(this)的一些理解:
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
三、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的除synchronized(this)同步代码块以外的部分。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报

RE: 关于synchronized

郭利超 发表于 2013-3-18 18:23
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有 ...

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。   首先你这样提到,也就是在一个线程运行的时候会判断在该锁也就是同步里面是否有其他的线程在执行,那么如果比如这样,在同步函数里面加了判断标记,这样是不是可以理解为加了双重锁一样,当一个线程进来时,会不会在这两个地方同时都上锁,或者将标记改为真,以防止其他线程运行呢?当这个线程wait()了,这个时候,另外一组线程也按这样的方式,直到出了同步把锁打开让其他线程进去,可是为什么还会出现不和谐的情况?比如毕老师的生产和消费视频,生产和消费不统一的情况呢?
能不能和我说说synchronized(this)情况,不太明白,谢谢你,辛苦了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马