博客
关于我
java中的synchronized和linux系统的futex到底什么个关系?
阅读量:89 次
发布时间:2019-02-25

本文共 1397 字,大约阅读时间需要 4 分钟。

Linux futex与Java中的synchronized锁

Linux Futex的基础知识

Futex(Fiber mutex)并非传统意义上的锁,而是锁实现中的一个基础组件。它允许在用户态完成锁的部分操作,而不需要所有操作都在内核态完成。这通过两个系统调用:futex_wait和futex_wake实现。这些系统调用帮助用户空间实现锁的机制,减少了内核态的参与,从而提升了性能。

锁的工作原理

传统锁在内核态完成所有操作,然而这可能导致频繁的上下文切换,影响性能。现代锁设计通过将部分操作移至用户态实现,减少了内核态的负担。通过CAS算法,在用户态完成抢锁的尝试,大部分情况下抢锁成功,竞争激烈时则进入内核态等待或唤醒。

Java中的Synchronized锁

Java的synchronized锁依赖于JVM的monitor机制,实际上使用了glibc中的pthread_mutex和pthread_cond。这些接口基于Futex实现,用户态部分由JVM管理,内核态部分由Futex系统调用完成。这种设计使得Java在Linux上的多线程实现高效。

示例分析

以下Java代码展示了synchronized锁在多线程环境中的行为:

public class TestFutex {    private Integer a = new Integer(1);    synchronized void showA() {        System.out.println(a);        try {            Thread.sleep(3000);        } catch (InterruptedException e) {        }    }    class T extends Thread {        @Override        public void run() {            showA();        }    }    public T newThread() {        return new T();    }    public static void main(String[] args) {        TestFutex tf = new TestFutex();        T t1 = tf.newThread();        T t2 = tf.newThread();        t1.start();        t2.start();    }}

在这个例子中,两个线程同时启动,试图进入synchronized方法。当第一个线程进入方法时,其他线程进入futex_wait等待状态,直到锁被释放。

JUC中的ReentrantLock和Semaphore

JUC中的ReentrantLock和Semaphore也基于Futex实现。LockSupport.park方法使用Futex进行park和unpark操作,这是实现可重入锁和信号量机制的基础。

总结

Futex作为锁实现的基础组件,在用户态和内核态都发挥着重要作用。Java的synchronized锁和JUC组件利用Futex实现了高效的多线程锁机制,这在Linux环境中得到了广泛应用。

转载地址:http://gan.baihongyu.com/

你可能感兴趣的文章
python下用decode和encode 中文转码
查看>>
Python下调用Linux的Shell命令
查看>>
Python接口自动化测试实战系列
查看>>
python下载_安装_配置_以及第一行python程序---python工作笔记009
查看>>
Python不协调机器人消息.内容
查看>>
Python与C#之间内存共享互传信息
查看>>
python与c语言混合编程_你试过C语言和Python一起混合编程吗?两者相加不是已经无敌了!...
查看>>
python与excel
查看>>
Python与Excel的完美邂逅:深入浅出,手把手教你轻松玩转Excel数据操作
查看>>
python与flask_Python编程中flask的简介与简单使用
查看>>
python与图灵机器人交互(WXPY版本)
查看>>
python与运算符_python运算符
查看>>
python两个列表获取交集,并集,差集
查看>>
python两个字典合并,两个list合并
查看>>
Python两个版本共存时,命令行升级pip
查看>>
Python两个版本共存时,怎么验证是否安装成功 scrapy
查看>>
Python两个版本共存时,通过pip安装Scrapy
查看>>
python两组变量的相关关系散点图_变量是什么?变量间的两种关系——函数关系和相关关系(小学版)...
查看>>
Python中 pass语句的作用
查看>>
python中 urllib, urllib2, httplib, httplib2 几个库的区别
查看>>