首页 > 编程知识 正文

java读写锁实现原理,linux线程同步的方法

时间:2023-05-06 12:07:31 阅读:57397 作者:1834

1 .读写锁定1.1适用场景大量阅读、少量书写

1.2原理多个程序可以并行对临界资源进行读取操作,程序不会产生二义结果。 在读/写锁定内部,有一个引用计数,用于计数当前在读取模式下打开的读/写锁定的线程数。 使用引用计数确定当前读写锁定是否有线程在读取模式下打开,并确定读写锁定何时已空闲且未被占用。 1.3读写锁定三种模式在读写模式下打开读写锁定,在写入模式下打开读写锁定。 1.4面试题问题:线程a读取模式、线程b读取模式,并已获得读写锁定。 线程c想在写入模式下打开。 线程d想在读取模式下打开。 询问线程d是否可以直接获取读写锁定。

不能以写模式打开线程c,因为如果d能够获得读/写锁定,则线程c永远也不会获得读/写锁定,假设以后只有要获得读模式的线程

1.5接口1 .接口初始化

int pthread_rwlock_init

2 .放弃接口

int pthread_rwlock_destroy

3 .读法

int pthread_rwlock_rdlock

int pthread_rwlock_tryrdlock

4 .写入模式

int pthread_rwlock_wrlock

int pthread_rwlock_trywrlock

5 .解除接口锁定

int pthread_rwlock_unlock

2. CAS自由锁定编程2.1前言CAS (比较交换),CAS根据其设计思想,可以分为乐观锁定。 与同步关键字不同,同步提供了悲观的锁定。 乐观锁定和悲观锁定基于线程同时竞争的观点。 悲观锁定是假设每次操作都会悲观地发生线程竞争,如果不锁定,程序的结果就会错误。 乐观锁定是指乐观地认为不需要锁定,因为每次操作都不会引起线程竞争。 因此,CAS被称为无锁编程,实际上是乐观锁的体现。

2.2代码void*myThreadstart(void*arg ) ringqueue*rq=(ringqueue* ) arg; for(intI=0; i 1000; I () { rq-add ); printf(%d(n )、rq-ret ) ); }返回空值; }两个线程累积相同的共享变量,线程不安全,输出的计数小于或等于2000。 要解决这个问题,可以进行锁定,但如何在没有锁定的情况下编程和解决CAS呢?

实现的密钥是AtomicInteger#getAndIncrement ()方法,因为无论当前运行多少次,结果都是2000,即写有线程安全计数操作而未锁定。 因此,让我们直接查看getAndIncrement () )的源代码。

/* * atomicallyincrementsbyonethecurrentvalue.*原子地将当前值设置为1 */publicfinalintgetandincrement ({ return unsafe.getandadddddend } do { var5=this.getint volatile (var 1,var2); } while (! this.compareandswapint(var1、var2、var5、var5 var4); 返回var 5; }此实现主要调用this.compareandswapint(…)方法。 此方法为CAS ) compareandswap,将进行比较和交换。 因为是比较和交换,所以应该明确比较什么和交换什么这两点。

CAS操作有三个变量(v、e、n ),v是要更新的变量,e是期望值),n表示新值。

首先,判断变量的当前值(v )是否等于期望值(e ),如果不等于,则表示当前线程已修改变量,在同步返回主内存之前,另一个线程已修改变量,并同步返回主内存。 因此,当前线程无法将值与主内存同步。 而是再次从主存储器读取值,并使新值与主存储器同步,直到当前值(v )等于期望值(e )。

2.3进程描述线程a从主存储器读取变量count作为值v; 线程a读取count的最新值,作为期望值的e线程a比较值(v )和期望值(e )是否相等,相等时将新值(n )写回到主存储器,不相等时返回操作1。 其中第三步是原子操作。 比较v和e的形势是为了确保变量count没有被其他线程修改。

2.4 CAS缺陷自旋的实现方式是所有线程在高频下运行,争夺CPU。 如果长时间操作失败,则CPU的消耗量变大,不仅是对单一变量的操作,如果不能用多个变量实现原子操作,则ABA问题ABA问题是指主存储中的count变量从100变为101,进而变为100。 虽然此时仅为100,但是在这种情况下,100与原始100的含义不同,但是对于线程a是不可感知的,并且如果在实际开发中不需要考虑ABA的影响,则可以使用CAS。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。