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

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

Linux futex与Java中的synchronized锁

Linux Futex的基础知识

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

锁的工作原理

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

Java中的Synchronized锁

Java的synchronized锁依赖于JVM的monitor机制,实际上使用了glibc中的pthread_mutexpthread_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中的ReentrantLockSemaphore也基于Futex实现。LockSupport.park方法使用Futex进行parkunpark操作,这是实现可重入锁和信号量机制的基础。

总结

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

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

你可能感兴趣的文章
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx反向代理是什么意思?如何配置Nginx反向代理?
查看>>
nginx反向代理解决跨域问题,使本地调试更方便
查看>>
nginx启动脚本
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx开机启动脚本
查看>>
nginx异常:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf
查看>>
nginx总结及使用Docker创建nginx教程
查看>>
nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:128
查看>>
nginx报错:the “ssl“ parameter requires ngx_http_ssl_module in usrlocalnginxconfnginx.conf128
查看>>
nginx日志分割并定期删除
查看>>
Nginx日志分析系统---ElasticStack(ELK)工作笔记001
查看>>
Nginx映射本地json文件,配置解决浏览器跨域问题,提供前端get请求模拟数据
查看>>
nginx最最最详细教程来了
查看>>
Nginx服务器---正向代理
查看>>
Nginx服务器上安装SSL证书
查看>>
Nginx服务器的安装
查看>>
Nginx模块 ngx_http_limit_conn_module 限制连接数
查看>>