`
seetoit
  • 浏览: 3203 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

java锁的问题

阅读更多
参考网上的例子,写了一个并发场景下的乐观锁demo,引出了一个新问题:锁的本质是什么?将内存中的一块区域只让一个线程访问?下面的get方法是只读的,它的上锁与否为什么对加法成功的效率有质的影响呢?

public class SimulatedCAS {

    private int value;

    public SimulatedCAS(int value) {
        this.value = value;
    }

    /** 此处上锁成功率要高很多,原因不清楚,讲道理,锁应该是锁的方法,不是value呀 */
    public synchronized int get(){
        return value;
    }

    public synchronized boolean casAdd(int expectedValue, int newValue){
//    try {
// Thread.sleep(300);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
        if(this.value == expectedValue){//如果期望值与当前V位置的值相同就给予新值
            value = newValue;
            return true;
        }
        return false;//返回V位置原有的值
    }

    public static void main(String[] args) throws Exception {
        SimulatedCAS casObj = new SimulatedCAS(10);
       
        Runnable r = new Runnable() {

@Override
public void run() {
String threadName = Thread.currentThread().getName();

long currentTimeMillis = System.currentTimeMillis();
Random rand = new Random();
int nextInt = rand.nextInt(10) + 1;

boolean succ = false;
do {
int oldValue = casObj.get();
int newValue = oldValue+nextInt;
succ = casObj.casAdd(oldValue, newValue);
int resultValue = casObj.get();
System.out.println(currentTimeMillis + "#" + threadName + "#" + oldValue + "~" + newValue
+ "\n\t随机数:" + nextInt + "\t操作结果:" + succ
+ "\t 操作:" + oldValue + " + " + nextInt + " = " + resultValue);
} while(!succ);
}
};
       
       
List<Thread> tList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
        Thread t = new Thread(r);
        t.setName("thread" + i);
       
        tList.add(t);
       
        t.start();
        }
       
        for (Thread thread : tList) {
            thread.join();
        }
       
        System.out.println("result: " + casObj.get());
       
    }
}


=======================================================
1626430679911#thread3#10~18
随机数:8 操作结果:true 操作:10 + 8 = 18
1626430679911#thread4#10~11
随机数:1 操作结果:false 操作:10 + 1 = 22
1626430679911#thread0#10~11
随机数:1 操作结果:false 操作:10 + 1 = 18
1626430679911#thread5#18~28
随机数:10 操作结果:false 操作:18 + 10 = 22
1626430679911#thread1#10~19
随机数:9 操作结果:false 操作:10 + 9 = 18
1626430679911#thread1#34~43
随机数:9 操作结果:true 操作:34 + 9 = 43
1626430679912#thread2#18~22
随机数:4 操作结果:true 操作:18 + 4 = 22
1626430679911#thread5#24~34
随机数:10 操作结果:true 操作:24 + 10 = 34
1626430679911#thread0#23~24
随机数:1 操作结果:true 操作:23 + 1 = 24
1626430679911#thread4#22~23
随机数:1 操作结果:true 操作:22 + 1 = 23
result: 43
分享到:
评论

相关推荐

    java锁详解.pdf

    Java 锁详解 Java 锁是 Java 并发编程中的一种基本机制,用于确保线程安全和避免竞争条件。Java 锁可以分为两大类:synchronized 锁和 ReentrantLock 锁。 一、Synchronized 锁 1. 锁的原理:synchronized 锁是...

    java锁机制Synchronizedjava锁机制Synchronized

    Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被看作是一个大房子,其中有多个...

    java锁的释放与建立

    本篇文章将深入探讨Java锁的释放与建立,以及它们之间的_happens-before_关系,旨在帮助开发者更好地理解和应用并发控制。 首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`...

    Java锁机制详解.pdf

    Java锁机制详解.pdf java线程 java多线程 Java锁机制详解.pdf java线程 java多线程

    java并发锁面试知识

    java中的乐观锁与悲观锁,synchronized与ReentrantLock重入锁的说明与比较

    彻底理解Java中的各种锁.pdf

    java各种锁机制

    java 读写锁代码

    Java 读写锁是Java并发编程中的一种重要机制,它为多线程环境下的数据访问提供了更为精细的控制。在Java的`java.util.concurrent.locks`包中,`ReentrantReadWriteLock`类实现了读写锁的功能。这个锁允许多个读取者...

    面向Java锁机制的字节码自动重构框架.zip

    Java锁机制是多线程编程中的关键组成部分,用于控制对共享资源的访问,确保并发环境下的数据一致性。本文将深入探讨Java锁机制,并基于提供的"面向Java锁机制的字节码自动重构框架"来讨论其背后的原理和应用。 在...

    java锁机制详解.pdf

    java锁机制详解.pdf

    java 锁原理

    java 锁原理

    Java基于redis实现分布式锁代码实例

    Java基于Redis实现分布式锁代码实例 分布式锁的必要性 在多线程环境中,资源竞争是一个常见的问题。例如,在一个简单的用户操作中,一个线程修改用户状态,首先在内存中读取用户状态,然后在内存中进行修改,然后...

    java-syn.zip_Java syn_Java syn锁_java同步锁syn_java锁 syn_syn同步事务锁

    4. **Java锁的类型**: - **内置锁**:也称为监视器锁,由`synchronized`关键字提供。 - **显式锁**:如`java.util.concurrent.locks.Lock`接口及其实现,如`ReentrantLock`,提供了更复杂的锁操作,如可中断锁...

    从锁的介绍,到java锁(lock、synchronor、aqs)到分布式锁 redis、zk、数据库的悲观锁和乐观锁

    当前的PPT总共56页,从锁的介绍,到java锁(lock、synchronor、aqs)到分布式锁 redis、zk、数据库的悲观锁和乐观锁都有涉及,算是比较完整的一个PPT,适合涉及到锁相关的专题讲座,以及自学的PPT,后面有机会会开...

    java 门锁终于被打开了(解决死锁)

    本文将深入探讨Java中的门锁以及如何解决死锁问题。 首先,Java提供了多种门锁实现,包括`synchronized`关键字和`java.util.concurrent.locks`包中的`ReentrantLock`。`synchronized`关键字用于同步方法或代码块,...

    Java锁.xmind

    【图解版】Java锁精确分类,从JAVA各类锁进行分析和分类,精确分类Java各种锁,不可用于商业用途,如有版权问题,请联系删除!

    redis实现分布式锁(java/jedis)

    redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现 redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现

    Java的锁机制的学习和使用

    Java的锁机制的学习和使用,Java的锁机制的学习和使用

    不死锁的哲学家问题实现 java

    在Java中,我们可以使用信号量(Semaphore)来解决不死锁的哲学家问题。信号量是一种同步原语,用于控制对共享资源的访问。在本实现中,我们将创建两个类型的信号量:一个用于表示筷子,另一个用于控制哲学家可以...

    JAVA技术栈-锁机制知多少

    锁机制的核心是解决并发访问资源时的冲突问题。Java中提供了多种类型的锁,包括: 1. **Synchronized**:Java内置的同步机制,具备可重入性,即一个线程可以多次进入由同一锁保护的代码块。它是非公平锁,但可以...

    Java锁的种类以及区别

    一、公平锁/非公平锁,二、可重入锁,三、独享锁/共享锁,四、互斥锁/读写锁

Global site tag (gtag.js) - Google Analytics