一点一点学线程(二)锁

本文详细介绍了Java中的线程安全问题及其解决方案——锁。涵盖了Synchronized的同步代码块、同步方法及其应用场景,包括this锁和static锁,以及死锁的概念。进一步探讨了ReentrantLock(来自concurrent包),解释了Lock接口、可重入锁的重要性以及ReentrantLock的公平锁和非公平锁。最后提到了ReentrantReadWriteLock,强调了读写锁在并发控制中的作用。
摘要由CSDN通过智能技术生成

在线程中我们需要访问的数据没有被保护,这就是多线程最令人头疼的地方,线程安全,多线程之间的数据共享引发的安全问题。解决办法是采用加锁。

何为加锁呢?就是我们将部分数据保护起来,每次只能有一个线程进行访问。

1.Synchronized

1.1同步代码块

有效范围:

同步代码块最小的粒度应该放在共享数据的上下文,或者说共享数据被操作的上下文中。

语法:

Java 中同步代码块的语法如下所示,其中 obj 是任何一个对象;

......

synchronized(obj)

{

......//your business code

}

......

1.2同步方法

方法的同步和代码块的公布大相径庭就是在方法名前面加上 synchronized 关键字,具体的格式如下:

Private|default|protected|public  [static]  synchronized  void|return  type

methodName(Parameters)

1.2.1同步重构方法

package com.wenhuisoft.chapter3;

class TicketWindow2 implements Runnable

{

private int max_value = 0;

public void run()

{

while (true)

{

if(ticket())

break;

}

}

/**

*

*/

private synchronized boolean ticket()

{

if (max_value > 500)

{

return true;

}

try

{

Thread.sleep(10);

} catch (InterruptedException e)

{

}

System.out.println(Thread.currentThread().getName() + ":" +

max_value++);

return false;

}

}

1.2.2同步run方法

 run 方法加了锁,其他线程只有等待的份,第一个线程执行完毕退出,其他线程获取到了锁,想要执行,一看判断已经不符合则自动退出;因此 run 方法加锁,真实情况是会有多个线程运行,但是只有一个线程执行业务逻辑,其他线程都等于阻塞状态。

1.2.3 同步总结

不管是同步代码块或者同步方法,我们需要事

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值