聊聊线程安全

简单了解到java有几种方式实现线程安全的方式,synchronized和ReentrantLock。

 

synchronized是java的一个关键字,用于同步安全;分别有同步方式和同步代码块来解决同步安全问题。

ReentrantLock是jdk1.5后新出的一个类,解决同步安全的。

 

此处,我们引入一个例子来验证同步安全。

题目:现在有四个窗口来贩卖100张票,我们应该如何实现。

分析:四个窗口我们可以看成四个线程,100张门票是线程要共享的数据。

解决:

票对象

 

窗口对象

运行结果:由于没有考虑安全问题,出现了重票;

有三种改进方法:

第一种:添加同步代码块:synchronized(同步监视器){}

同步监视器:只能是对象,不限制对象类型;但多个线程必须使用同一个监视器才能有同步安全效果。

第二种:把方法改为同步方法,如果是静态同步方法同步监视器是类对象,非静态同步方法是当前类的实例对象

第三种:引入ReentrantLock对象,多个线程也要公用一个lock才会有同步安全。

synchronized和ReentrantLock异同点

相同:

  • 都是解决同步安全的

不同:

  • synchronized是关键字;ReentrantLock是一个类
  • synchronized是自动解锁;ReentrantLock要手动加锁/解锁

使用时注意:千万根据实际情况来进行加锁且加锁范围要恰到好处,示例中的第二种方式同步范围过大只会有一个窗口在卖票,导致其他窗口不能卖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程和线程是操作系统中的两个重要概念,它们都是用于实现并发的技术。 进程是指在操作系统中正在运行的一个程序,每个进程都有自己独立的地址空间、代码、数据和打开的文件等资源。进程之间是相互独立的,它们之间通过系统调用和进程间通信(IPC)等方式来进行数据交换和协作。在多进程的应用中,每个进程都是独立的,相互之间不会影响。 线程是进程中的一个执行单元,一个进程可以包含多个线程,每个线程共享相同的地址空间、代码和数据等资源。线程之间可以直接访问进程中的共享资源,因此在多线程的应用中,不同线程之间可以通过共享内存来实现数据交换和协作。 在大数据应用中,一般使用多进程来实现分布式计算,每个进程都可以在不同的机器上运行,相互之间通过网络通信来完成任务。而在数据处理过程中,由于需要同时处理多条数据,因此使用多线程来实现并发处理能够提高效率。 进程和线程的区别主要有以下几点: 1. 进程是操作系统资源分配的基本单位,而线程是程序执行的基本单位; 2. 进程之间是相互独立的,而线程之间共享进程中的资源; 3. 进程拥有独立的地址空间,而线程共享相同的地址空间; 4. 进程切换开销大,因为需要切换整个上下文环境,而线程切换开销小,因为只需要保存和恢复少量寄存器; 5. 进程之间相互隔离,保证了数据安全性,而线程之间共享资源需要考虑同步和互斥问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值