- 浏览: 461091 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (369)
- javascript html (20)
- java (31)
- jquery (15)
- jcrop (0)
- JEECG (1)
- ajax (3)
- 反射 (3)
- VI (1)
- mysql (48)
- easyui (1)
- svn (2)
- MD5 加密 (1)
- spring (14)
- ORACLE (8)
- 经验总结 (1)
- TCP/IP协议 (1)
- ICMP协议 (1)
- eclipse (1)
- Reflect (1)
- linux (21)
- android (5)
- excel 操作 (1)
- java tree (1)
- html (1)
- plupload (1)
- mongodb (9)
- aes (1)
- python (1)
- java relax (1)
- highcharts (2)
- json (2)
- java 多线程 (30)
- maven (2)
- 设计模式 (1)
- jsp+js (2)
- 面向对象 (1)
- jvm (16)
- 缓存 (1)
- proxy (1)
- 聊侃 (1)
- 面经 (1)
- java 字节 (1)
- java 类加载器 (2)
- java 基础 (2)
- java 语法糖 (1)
- java 位运算 (1)
- 排序 (3)
- java 服务器性能优化 (19)
- 网络编程 (2)
- jvm 参数设置 (0)
- jersey (1)
- webservice (2)
- nginx+多tomcat 集成 (5)
- nginx (16)
- squid (3)
- memcached (5)
- 正则表达式 (1)
- 常用免费接口 (1)
- jpa (1)
- win7 (1)
- java处理大文件 (1)
- js正则表达式 (1)
- tomcat (1)
- java 敏感字 (1)
- 系统架构优化 (4)
- 学习 (1)
- 本地测试QQ微博第三方登陆 (1)
- java 错误 (1)
- 微信支付 (1)
- https (1)
- httpclient (1)
- awk (2)
- loadrunner (1)
- sql server 2008 (3)
- git (4)
- sql server2008 (1)
- solr (2)
- centos (1)
- 数据存储架构 (3)
- log4j (1)
- weboffice (1)
- 并发编程 (1)
- postgreSQL (0)
- ssl (1)
- openssl (1)
- activeMQ (2)
- IDEA (1)
- shell (1)
- ansible (4)
- docker (2)
- grafana (1)
- jmeter (1)
- TLS (1)
- 将博客搬至CSDN (1)
最新评论
-
dida1990:
啊喔,过去了这么久,不过还是评一个。谁说uuid的hashCo ...
高并发生成订单号(二) -
annan211:
yclovesun 写道使用了uuid,为什么还要machin ...
高并发生成订单号(二) -
yclovesun:
使用了uuid,为什么还要machineId?uuid已经可以 ...
高并发生成订单号(二) -
u013280917:
太深奥,看不懂
mysql优化特定类型的查询
Java的多线程安全是基于Lock机制(或者隐式锁synchronized)实现的,而Lock的性能往往不如人意。
原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。
互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。
为了优化Java的Lock机制,从Java6开始引入了轻量级锁的概念。
轻量级锁(Lightweight Locking)本意是为了减少多线程进入互斥的几率,并不是要替代互斥。
它利用了CPU原语Compare-And-Swap(CAS,汇编指令CMPXCHG),尝试在进入互斥前,进行补救。
这里先介绍第一种轻量级锁 自旋锁
自旋锁的原理是 让其他线程不断的循环等待着去用自身线程引用去加锁(当锁的竞争不大且,锁的时间段比较长的时候适用)
使用 AtomicReference 的方法 compareAndSet(V expect, V update):如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
代码如下:
实例如下:
稍微面向对象点 是这样子的
原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。
互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。
为了优化Java的Lock机制,从Java6开始引入了轻量级锁的概念。
轻量级锁(Lightweight Locking)本意是为了减少多线程进入互斥的几率,并不是要替代互斥。
它利用了CPU原语Compare-And-Swap(CAS,汇编指令CMPXCHG),尝试在进入互斥前,进行补救。
这里先介绍第一种轻量级锁 自旋锁
自旋锁的原理是 让其他线程不断的循环等待着去用自身线程引用去加锁(当锁的竞争不大且,锁的时间段比较长的时候适用)
使用 AtomicReference 的方法 compareAndSet(V expect, V update):如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
代码如下:
class SpinLock { private AtomicReference<Thread> sign = new AtomicReference<Thread>(); public void lock() { Thread current = Thread.currentThread(); //System.out.println(Thread.currentThread().getName() + " wait"); while (!sign.compareAndSet(null, current)) { } } public void unlock() { Thread current = Thread.currentThread(); sign.compareAndSet(current, null); } }
实例如下:
package thread; import java.util.concurrent.atomic.AtomicReference; public class SpinLockTest { private static int count = 0; private static SpinLock spinLock = new SpinLock(); /** * @param args */ @SuppressWarnings("static-access") public static void main(String[] args) { for (int i = 0; i < 100000; i++) { Thread thread = new Thread(new Runnable(){ @Override public void run() { spinLock.lock(); count++; spinLock.unlock(); } }); thread.start(); } System.out.println("here"); try { Thread.currentThread().sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); } } /** * 自旋锁 让其他线程不断的循环等待着去用自身线程引用去加锁(当锁的竞争不大且,锁的时间段比较长的时候适用)。 */ class SpinLock { private AtomicReference<Thread> sign = new AtomicReference<Thread>(); public void lock() { Thread current = Thread.currentThread(); //System.out.println(Thread.currentThread().getName() + " wait"); while (!sign.compareAndSet(null, current)) { } } public void unlock() { Thread current = Thread.currentThread(); sign.compareAndSet(current, null); } }
稍微面向对象点 是这样子的
package thread; import java.util.concurrent.atomic.AtomicReference; public class SpinLockTest2 { static int count = 100; public static void main(String[] args) { final SplinLock lock = new SplinLock(); for(int i=0;i<100;i++){ new Thread(new ThreadDemo(lock)).start(); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); } } class ThreadDemo implements Runnable{ private SplinLock lock; public ThreadDemo(SplinLock lock){ this.lock = lock; } @Override public void run() { lock.lock(); System.out.println(Thread.currentThread().getName()+"---"+SpinLockTest2.count); SpinLockTest2.count--; lock.unlock(); } } class SplinLock{ private AtomicReference<Thread> reference = new AtomicReference<Thread>(); public void lock(){ Thread thread = Thread.currentThread(); while(!reference.compareAndSet(null, thread)){ } } public void unlock(){ Thread thread = Thread.currentThread(); reference.compareAndSet(thread, null); } }
发表评论
-
java 多线程操作数据库 及 静态bean注入
2018-01-09 10:47 916package com.robustel.rlink.de ... -
Amino 框架简介
2014-10-17 11:30 1427对数据加锁是实现多线程的一种策略,但是加锁无疑会增加系 ... -
Java 重入锁(ReentrantLock)和内部锁(synchronized)
2014-10-16 15:44 1594ReentrantLock 和 synchronize的 ... -
Java 锁分离
2014-10-16 15:35 1332读写锁思想的延伸就是锁分离。读写锁根据读写操作功能上 ... -
java 高性能运算-- 双端队列
2014-10-15 16:04 1046JDK 1.6中 提供了一种双端队列,简称 Dequ ... -
java 高性能运算--并发队列
2014-10-15 15:33 2490JDK 提供了两套并发队列的实现,一个是以 Conc ... -
并发模式下的单例创建
2014-09-29 16:20 788单例模式的创建 分为 ... -
Java 同步集合的应用
2014-09-14 23:45 0Java 同步集合的应用 -
java 阻塞队列的应用
2014-09-14 23:44 0java 阻塞队列的应用 -
java 多线程集合
2014-09-14 23:28 0java 多线程集合 -
java Exchanger 线程数据交换
2014-09-14 22:56 0java Exchanger 线程数据交换 -
java CountDownLatch 实例
2014-09-15 18:07 851Java的concurrent包里面的CountDownLat ... -
java 多线程之 CyclicBarrier
2014-09-13 19:25 818CyclicBarrier (周期障碍)类可以帮助同步,它允许 ... -
java CyclicBarrier 循环阻塞
2014-09-12 22:43 437java CyclicBarrier 循环阻塞 -
java 多线程的锁消除
2014-09-12 18:31 1243Java 中使用同步 来保证数据的安全性,但是对于一些明显不会 ... -
Java锁的种类以及辨析
2014-09-12 15:15 1575锁作为并发共享数据,保证一致性的工具,在java平台有多种实现 ... -
java Semaphore 信号量详解和实例
2014-09-12 11:51 2154生产者线程用于往链表里添加节点,数个工作线程从链表取出节点并处 ... -
4个线程,2个每次加1,两个每次减1
2014-09-01 23:44 852package threadTest; public ... -
线程范围内的共享数据 ThreadLocal 分析与详解
2014-08-30 19:21 811Java 线程范围内的数据共享机制,需要解决的问题是 : 多 ... -
java多线程之Semaphore信号量详解
2014-08-27 13:35 1310原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...
相关推荐
二:自旋锁示例 三:SpinLock 四:继续SpinLock 五:总结 一:基础 内核锁:基于内核对象构造的锁机制,就是通常说的内核构造模式。用户模式构造和内核模式构造 优点:cpu利用最大化。它发现资源被锁住,请求就...
本文将深入探讨如何使用Redis实现分布式锁,以及如何利用自旋式加锁和Lua脚本实现原子性解锁。 首先,我们来理解分布式锁的基本概念。分布式锁是在多节点之间共享资源时,用于协调各个节点的访问控制机制。在分布式...
本文主要讨论了四种锁类型:乐观锁、悲观锁、自旋锁以及Java中的synchronized同步锁,并深入解析了synchronized锁的内部机制,包括其核心组件、实现方式以及锁的状态。 1. **乐观锁**:乐观锁假设在多线程环境下,...
量子力学中的自旋概念是理解物质微观世界中粒子特性的一个重要方面。本章《自旋》深入探讨了电子自旋的本质、相关数学工具以及实验验证。 首先,自旋算符与Pauli矩阵是研究自旋系统的两个基础工具。自旋算符用于...
量规/引力对偶作为物质理论需要一种系统的方法来表征系统。 我们建议“批量提升”与本体理论最不相关的相互作用。 例如,我们考虑自旋-轨道相互作用,这会引起磁电相互作用项。 我们表明,它的举升是轴键耦合。 我们...
自旋锁的基本思想是当一个线程试图获取已被其他线程持有的锁时,它不会立即阻塞,而是不断地循环检查锁的状态,直到锁变为可用状态为止,这个过程称为“自旋”。在Linux内核中,自旋锁是实现内核级并发的重要工具。 ...
在Windows驱动程序开发中,理解和掌握中断请求级别(IRQ)以及自旋锁是至关重要的。本视频教程将深入探讨这两个核心概念,旨在帮助开发者提升驱动程序的性能和稳定性。 首先,我们来了解一下中断请求级别(IRQ)。...
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放...
Linux系统内核的同步机制是确保多线程和多处理器环境下正确访问共享资源的关键部分,其中自旋锁作为一项重要工具,被广泛用于保护短暂的、临界区的访问。自旋锁的设计理念在于,当一个线程尝试获取已被其他线程持有...
1. 自旋光电流(Spin Photocurrent):自旋光电流是一种新的电子学现象,它通过自旋轨道耦合实现电子的自旋极化。在这种现象中,光子激发电子,产生自旋极化的电子流。 2. 电流诱导的电子自旋极化(Current-Induced...
自旋锁是多线程编程中的一个重要概念,用于在共享资源上实现轻量级的同步。自旋锁的原理是当一个线程试图获取已被其他线程持有的锁时,它不会立即阻塞,而是会“自旋”等待,直到锁被释放为止。这样做的好处是可以...
自旋锁(Spin Lock)是另一种常见的同步机制,主要用于短时间内对资源的保护。它的主要特点是当一个线程试图获取已锁定的资源时,并不会立即进入阻塞状态,而是会持续“自旋”(即循环检查)直到资源变得可用为止。...
4. `5_queuelock.cpp`:队列锁(也称为自旋队列锁)是一种更复杂的自旋锁,它通过维护一个请求锁的线程队列来减少竞争。 5. `6_threadlocal.cpp`:可能涉及到线程局部存储,这种技术可以为每个线程提供独立的数据,...
自旋锁的原理是,当一个线程试图获取一个已经被其他线程持有的锁时,它不会像普通互斥锁那样进入睡眠状态,而是会不断地循环检查锁的状态,直至锁变为可用状态。这种机制在处理器等待时间短且锁持有时间也很短的情况...
通过自旋极化电子反射研究了Co或酞菁(Pc)分子覆盖层对Co(001)顶部Cu层中量子阱共振(QWR)性质的影响。 对于Co原子和Pc分子,随着覆盖率的增加,观察到QWR诱导信号的能量转移,这归因于Cu / Co和Cu / Pc界面电子...
本文将深入探讨两种常见的同步机制——信号量和自旋锁,它们在Linux内核中的应用以及如何有效地使用它们。 #### 一、信号量:睡眠锁机制 **信号量**是一种广泛使用的同步机制,用于控制多个进程对共享资源的访问。...
当一个处理器尝试获取自旋锁时,如果该锁当前被另一个处理器占用,则该处理器将继续尝试获取该锁,直到获得访问权。 在SMP系统中,自旋锁的实现非常重要,因为它可以确保多个处理器之间的并发执行。为了实现自旋锁...
本文将深入探讨自旋锁的实现机制、不同类型的自旋锁以及它们的基准测试。我们将以C语言作为实现和测试的基础,因为它是低级编程和系统编程的常用语言,能够更好地理解和控制底层细节。 1. **自旋锁基础** - **定义...