首页 > 数据库 >java synchronized 还是用redis 锁 java的synchronized的实现原理

java synchronized 还是用redis 锁 java的synchronized的实现原理

时间:2024-04-10 10:13:58浏览次数:16  
标签:java Thread synchronized redis SychronizedTest thread 线程 thread2

synchronized是同步的意思,在java多线程中,我们一般会考虑共享数据的处理,共享数据的处理包含两块,第一是共享数据,第二是在多线程访问共享数据的时候,如果处理共享数据,保证数据的有效正确性。

我们要保证线程A访问共享数据,对数据进行处理的时候,其他线程能够等待线程A访问完毕后,和线程A看到相同的数据,再进行自己的业务处理,这也就是互斥锁。

java中,synchronized可以保证同一时刻,只有一个线程对某个方法某个代码块访问的时候。synchronized还有一个作用,保证一个线程的变化(主要是共享数据的变化),能够被其他线程看到。

synchronized的三种应用方式:

1、修饰实例方法,作用于实例方法,给实例加锁

2、修饰静态方法,给当前类加锁,要访问代码前,要获得类对象的锁

3、修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁

修饰实例方法

同步锁是给对象的,下面代码中,一个对象只有一把同步锁,两个线程获取同一把锁,所以thread2只能等到thread完成业务逻辑,释放同步锁,thread2才能获得锁,进行操作。运行结束后i的值为2000000。

package sychronized;
public class SychronizedTest implements Runnable {
     
     static int i = 0;
     
     public static void main(String[] args) throws InterruptedException {        SychronizedTest test = new SychronizedTest();
         
         Thread thread = new Thread(test);
         Thread thread2 = new Thread(test);
         
         thread.start();
         thread2.start();
         
         thread.join();
         thread2.join();
         
         System.out.print(i);
     }    @Override
     public void run() {
         for(int j=0;j<1000000;j++){
             increase();
         }
     }
     
     //对方法加了互斥锁
     public synchronized void increase(){
         i++;
     }
 }

如果此时thread和thread2获得的锁是不一样的对象,那么这两个线程是互补干扰的,不用相互等待对方获得互斥锁,各自可以获得对象锁,进行操作。这种情况下i的值就会被这两个线程同时操作,那么运行的结果就肯定是小于2000000。因为两个线程同时操作,异步进行。

类似这样

 

修饰静态方法

当synchronized作用于静态方法,那么锁就是当前class对象锁。由于静态成员不属于任何一个实例对象,而是属于类成员,因此通过class对象锁来控制静态成功的并发控制。如果一个线程调用一个实例对象的非static synchronized方法,并不会影响另外的线程调用该实例对象的synchronized方法,不会出现互斥现象。访问静态同步方法占用的锁是当前类的class对象,而访问非静态同步方法占用的锁是实例对象锁。
package sychronized;
public class SychronizedTest implements Runnable {
     
     static int i = 0;
     
     public static void main(String[] args) throws InterruptedException {        SychronizedTest test = new SychronizedTest();
         SychronizedTest test1 = new SychronizedTest();
         
         Thread thread = new Thread(test);
         Thread thread2 = new Thread(test1);
         
         thread.start();
         thread2.start();
         
         thread.join();
         thread2.join();
         
         System.out.print(i);
     }    @Override
     public void run() {
         for(int j=0;j<1000000;j++){
             //如果run是调用increase方法,此方法是静态方法,锁是当前的类对象锁,不属于任何一个实例化对象,结果是2000000
             increase();
             //如果run是调用increase1方法,那这个方法是实例化对象锁,多线程占用同一个对象锁,需要等待,多线程
             //占用不一样的锁,是互斥锁,不需要等待其他线程释放,就可以占用锁,结果小于2000000
             increase1();
         }
     }
     
     //对方法加了互斥锁
     public static synchronized void increase(){
         i++;
     }
     
     public synchronized void increase1(){
         i++;
     }
 }

 更多:http://www.shanhubei.com/archives/55169.html

标签:java,Thread,synchronized,redis,SychronizedTest,thread,线程,thread2
From: https://www.cnblogs.com/shanhubei/p/18125415

相关文章

  • 基于java+springboot+vue实现的农产品智慧物流系统(文末源码+Lw)23-239
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用农产品智慧物流系统可以有效管理,使信息管......
  • 基于java+springboot+vue实现的人事管理系统(文末源码+Lw)23-242
    摘 要使用旧方法对人事管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在人事管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的人事管理系统对字典管理、公告管理、绩效管理、......
  • IDEA打包JavaWeb项目
    1.File->ProjectStructure2.Artifacts->"+"->WebApplicationExploded->FromModules弹框选择对应Module,点击ok3."+"->WebApplicationArchive->For'xxx:warexploded'->最后点击"OK"4.Build->Build......
  • Redis如何防止高并发?
    其实redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。我们使用的时候,可能会出现并发问题,比如获得和设定这一对。Redis的为什么有高并发问题?Redis的的出身决定Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以red......
  • Java 动态代理给对象插入动态属性
    packagecom.gwm.gwmcenterbudget.projectbudget.client.api.dto;importcom.google.common.collect.Maps;importnet.sf.cglib.beans.BeanGenerator;importnet.sf.cglib.beans.BeanMap;importorg.apache.commons.beanutils.PropertyUtilsBean;importorg.slf4j.Logge......
  • 高可用之战:Redis Sentinal(哨兵模式)
    ★Redis24篇集合1背景在我们的《Redis高可用之战:主从架构》篇章中,介绍了Redis的主从架构模式,可以有效的提升Redis服务的可用性,减少甚至避免Redis服务发生完全宕机的可能。它主要包含如下能力:1.故障隔离和恢复:无论主节点或者从节点宕机,其他节点依然可以保证服务的正常运行,并......
  • 详解Java Chassis 3与Spring Cloud的互操作
    本文分享自华为云社区《JavaChassis3技术解密:与SpringCloud的互操作》,作者:liubao68。JavaChassis3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。本文在这个架构原则基础上,讨论......
  • GO——6分布式锁分布式id___自己使用redis实现,(官方),,分布式id,,go协程,,gin框架,,
    分布式锁分布式id#锁的作用:保证多线程并发情况下,数据的安全-互斥锁-递归锁只能保证同一个进程下的线程#django项目---》部署在多台机器上---》下单场景---》悲观锁--》同一时刻,必须获得锁才能进入下单流程,释放锁--》别人才能进入下单流程-用my......
  • 最短编辑距离(线性dp)-java
    最短编辑问题也是一种非常经典的二维线性dp问题。 文章目录前言一、最短编辑距离问题二、算法思路1.dp[i][j]的情况 2.边界问题初始化3.状态转移方程三、代码如下1.代码如下2.读入数据3.代码运行结果总结前言最短编辑问题也是一种非常经典的二维线性dp问......
  • Java入门基础知识第八课(数组)——冒泡排序、Arrays工具类
    前面二白讲了关于数组的概念、语法以及简单的输入输出,实际上关于数组的知识还有很多,接下来咱们讲一下冒泡排序以及一些常用的Arrays工具类,需要记忆的知识很多,而且容易混淆。一、冒泡排序简介(原理)升序为例:从头开始,每次比较相邻两数小的交换到前面每轮结束后最大的数交换到......