一、使用场景

在负责后台开发的时候,很多时候都是提供接口给前端开发人员去调用,会遇到这样的场景:

需要提供一个领奖接口,每个用户名只能领取一次,我们可以将成功领取的用户在数据库用个标记保存起来。如果这个用户再来领取的时候,查询数据库看该用户是否领取过。

但是问题来了,假设用户手速很快,极短时间内点了两次领奖按钮(前端没有进行控制,我们也不能依赖前端去控制)。那么可能掉了两次领奖接口,而且有可能第二次调用的时候查询数据库的时候,第一次领奖还没有执行完成更新领奖标记。

这种场景就可以使用到synchronized

二、使用实例

代码:

package com.luo.test;

public class SynTest {

    public static void main(String args[]) throws InterruptedException{
        SynTest synTest = new SynTest();
        synTest.test();
    }

    public void test() throws InterruptedException{
        new SynThread1().start();
        new SynThread1().start();
    }

    public void syn(String userName) throws Exception {
        synchronized(userName) {
            System.out.println("进入到同步块,userName=" + userName);
            Thread.sleep(5000);  //5秒
            System.out.println("退出同步块,userName=" + userName);
        }
    }

    class SynThread1 extends Thread {
        public void run(){
            try {
                syn("luoguohui");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

从结果来看,可知道,synchronized起作用了,这里调用了两次syn(String userName)方法,期间设置其停留5秒,但是还是等第一次执行完,第二次调用才进入synchronized块里面的。

为了进一步确认我们的假设,我们不防把synchronized去掉如下:

    public void syn(String userName) throws Exception {
//      synchronized(userName) {
            System.out.println("进入到同步块,userName=" + userName);
            Thread.sleep(5000);  //5秒
            System.out.println("退出同步块,userName=" + userName);
//      }
    }

运行结果:

对比即可分析出来了

使用方式从实例可看出来:

public void syn(String userName) throws Exception {
    synchronized(userName) {
        System.out.println("进入到同步块,userName=" + userName);
        Thread.sleep(5000);  //5秒
        System.out.println("退出同步块,userName=" + userName);
    }
}

用synchronized把代码括起来。

Java中synchronized的使用实例的更多相关文章

  1. java中synchronized的用法详解

    记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...

  2. java中synchronized的使用方法与具体解释

    Java语言的keyword.当它用来修饰一个方法或者一个代码块的时候,可以保证在同一时刻最多仅仅有一个线程运行该段代码. 一.当两个并发线程訪问同一个对象object中的这个synchronized ...

  3. Java 中 synchronized的用法详解(四种用法)

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧 ...

  4. java中 synchronized 的使用,确保异步执行某一段代码。

    最近看了个有关访问网络url和下载的例子,里面有几个synchronized的地方,系统学习下,以下内容很重要,记下来. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一 ...

  5. JAVA 中 synchronized 详解

    看到一篇关于JAVA中synchronized的用法的详解,觉得不错遂转载之..... 原文地址: http://www.cnblogs.com/GnagWang/archive/2011/02/27 ...

  6. java中synchronized关键字分析

    今天我们来分析一下java中synchronized关键字.首先来看一段java代码:(本地编译环境为mac,jdk1.8的环境) Demo.java package com.example.spri ...

  7. Java 中静态变量和实例变量区别

    Java 中静态变量和实例变量区别 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量. 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量. 在程序运行时的区别: 实例变量属于某个对 ...

  8. Java中synchronized 修饰在static方法和非static方法的区别

    [问题描述]关于Java中synchronized 用在实例方法和对象方法上面的区别 [问题分析]大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized ...

  9. java中synchronized与Lock的异同

    本文转载自java中synchronized与Lock的异同 前言 synchronized和Lock通过互斥保障原子性,能够保护共享数据以实现线程安全,其作用包括保障原子性.可见性.有序性 常见问题 ...

随机推荐

  1. [Codeforces 863A]Quasi-palindrome

    Description Let quasi-palindromic number be such number that adding some leading zeros (possible non ...

  2. [SHOI2008]cactus仙人掌图

    [题目描述] 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例 ...

  3. 洛谷P2221 [HAOI2012]高速公路

    线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...

  4. [矩形并-扫描线-线段树]Picture

    最近在补数学和几何,没啥好写的,因为已经决定每天至少写一篇了,今天随便拿个题水水. 题目大意:给你N个边平行于坐标轴的矩形,求它们并的周长.(N<=5000) 思路:这个数据范围瞎暴力就过了,但 ...

  5. hdu5630 BestCoder Round #73 (div.2)

    Rikka with Chess  Accepts: 393  Submissions: 548  Time Limit: 2000/1000 MS (Java/Others)  Memory Lim ...

  6. c# error

    部署iis c# 连sqlserver 用IIS发布之后,网页出错.提示为:异常详细信息: System.Data.SqlClient.SqlException: 用户 'NT AUTHORITY\I ...

  7. sqlserver批量更新数据

    update t_hr_teadept set rjkm=b.yjkmfrom t_hr_teadept a inner join t_tr_bzxx_km b on a.bzh=b.bzh wher ...

  8. angular 路由的引用

    使用angular路由 遇到的坑. 使用cmd 安装好node.js 安装成功 输入node  -v 能查看版本说明安装成功 搭建angular项目输入命令 npm install  -g  angu ...

  9. 数据库4m10d作业

    Create table student ( Sno char(15) primary key , Sname varchar(10) not null, Sage tinyint , Special ...

  10. 托管C++、C++/CLI、CLR

    1.什么是托管C++? 在回答这个问题,首先要搞清楚什么是"托管"(Managed).托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完 ...