百科狗-知识改变命运!
--

synchronized和ReentrantLock的区别

是丫丫呀12个月前 (12-05)阅读数 5#综合百科
文章标签线程代码

ReentrantLock 的lock机制有2种,忽略中断锁和响应中断锁,这给我们带来了很大的灵活性。比如:如果A、B2个线程去竞争锁,A线程得到了锁,B线程等待,但是A线程这个时候实在有太多事情要处理,就是 一直不返回,B线程可能就会等不及了,想中断自己,不再等待这个锁了,转而处理其他事情。这个时候ReentrantLock就提供了2种机制,第一,B线程中断自己(或者别的线程中断它),但是ReentrantLock 不去响应,继续让B线程等待,你再怎么中断,我全当耳边风(synchronized原语就是如此);第二,B线程中断自己(或者别的线程中断它),ReentrantLock 处理了这个中断,并且不再等待这个锁的到来,完全放弃。请看例子:

/**

* @version 0.10 2009-11-6

* @author Zhang Hua

*/

public class Test {

//是用ReentrantLock,还是用synchronized

public static boolean useSynchronized = false;

public static void main(String[] args) {

IBuffer buff = null;

if(useSynchronized){

buff = new Buffer();

}else{

buff = new BufferInterruptibly();

}

final Writer writer = new Writer(buff);

final Reader reader = new Reader(buff);

writer.start();

reader.start();

new Thread(new Runnable() {

public void run() {

long start = System.currentTimeMillis();

for (;;) {

// 等5秒钟去中断读

if (System.currentTimeMillis() - start > 5000) {

System.out.println("不等了,尝试中断");

reader.interrupt();

break;

}

}

}

}).start();

}

}

interface IBuffer{

public void write();

public void read() throws InterruptedException;

}

class Buffer implements IBuffer{

private Object lock;

public Buffer() {

lock = this;

}

public void write() {

synchronized (lock) {

long startTime = System.currentTimeMillis();

System.out.println("开始往这个buff写入数据…");

for (;;)// 模拟要处理很长时间

{

if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE)

break;

}

System.out.println("终于写完了");

}

}

public void read() {

synchronized (lock) {

System.out.println("从这个buff读数据");

}

}

}

class BufferInterruptibly implements IBuffer{

private ReentrantLock lock = new ReentrantLock();

public void write() {

lock.lock();

try {

long startTime = System.currentTimeMillis();

System.out.println("开始往这个buff写入数据…");

for (;;)// 模拟要处理很长时间

{

if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE)

break;

}

System.out.println("终于写完了");

} finally {

lock.unlock();

}

}

public void read() throws InterruptedException{

lock.lockInterruptibly();// 注意这里,可以响应中断

try {

System.out.println("从这个buff读数据");

} finally {

lock.unlock();

}

}

}

class Writer extends Thread {

private IBuffer buff;

public Writer(IBuffer buff) {

this.buff = buff;

}

@Override

public void run() {

buff.write();

}

}

class Reader extends Thread {

private IBuffer buff;

public Reader(IBuffer buff) {

this.buff = buff;

}

@Override

public void run() {

try {

buff.read();

} catch (InterruptedException e) {

System.out.println("我不读了");

}

System.out.println("读结束");

}

}

Thread和Runable的区别,Synchronized锁关键字

synchronize的中文意思:

vi.

同时化,同时发生[举行] (with) (几个钟表)指示同一时刻;物理学同步,整步;**声、像同步化,同步录音。

vt.

1.使同时;物理学使同[整]步。

2.校准,对准(钟表)。

3.同时处理,综合对照表示(历史事件);影、电视使声像一致;作同时[步]录音处理。

扩展知识:

1、synchronize例句与用法

The film does not?synchronize?with sound .

synchronized和ReentrantLock的区别

该影片画面与声音不同步。

2、Synchronized?blinker lights are set up in new york and san francisco .

两盏同步的闪光灯分别设在纽约和旧金山。

3、The?synchronized?low-frequency rectifier is similar to a push-pull rectifier .

同步低频整流器与推挽整流器相似。

4、Their operation must be?synchronized?with the operations of the existing furnaces .

这种操作必须同现有的高炉设备的运转同时进行。

5、For generations successive administrations had?synchronized?their moves with london .

几十年,历届政府与伦敦的行动步调都是一致的。

一、Thread和Runable的区别

1.Thread是基类,子类必继承他实现其run方法。其也是实现了Runable接口。Thread是普通的类,并非抽象类或者密封类等。

2.Runnable是接口,子类必须实现run方法,该接口就只有唯一的抽象方法run。

3.由于Java单继承,所以Thead通过类继承方式实现接口,存在扩展性问题。

4.他们都是通过start方法来启动,可以达到异步操作,如果用run方法启动其将是同步方法,失去多线程的意义。

5.Runnable,的实现类可以实现资源共享,多个调用只需要实例化Runnable的一个实例,然后将其放到 new Thread(new Runnable实现类).start方法(可以new多个一样的即表示多个线程),启动。

6.实验发现在实现Runnable的多线程中,如果同时启动的实例过多会在第一次执行的时候出现多线程并发,主要出现在开始,有肯能是程序启动加载资源导致,大多度数时候还是稳定的。比如实现的run方法控制了10个实际new 的个数太多久会出现,但是频率不高。

7.可以在Thread中实现匿名方法也可以实现多线程异步华。

8.主线程结束,子线程可以继续执行。

9.在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。

二、Synchronized

1.Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

2.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

3.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

4.尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

5.第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

6.以上规则对其它对象锁同样适用。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)