同步关键字(synchronized):

多线程给我们提供方便的时候,也给整个编程增加了难度,尤其是对临界资源的控制,尤为重要。

一个在操作系统课上,老掉牙的事例,就把这种情况解释的明明白白。

一对夫妻共用一张银行卡,老公呢准备出去买盒烟,一查卡里还有10000元,

但在他买烟的同时,他媳妇一下子支出去9999元,现实当中肯定是买不成烟了,

但多线程中,如果不加以控制,就会造成脏读脏写。

实例:

package com.xm.thread.t_19_01_27;

import java.util.concurrent.TimeUnit;

public class SynchronizedDemo  {

    public static void main(String[] args) throws InterruptedException {

        DemoThread demoThread = new DemoThread();

        for(int i=0;i<10000; i++) {
new Thread(demoThread).start();
} SynchronizedThread synchronizedThread = new SynchronizedThread(); for(int i=0; i<10000; i++) {
new Thread(synchronizedThread).start();
} TimeUnit.SECONDS.sleep(5);
System.out.println("DemoThread.count=="+demoThread.count);
System.out.println("SynchronizedThread.count=="+synchronizedThread.count);
} } class DemoThread implements Runnable { int count = 0; void add() {
count ++;
} @Override
public void run() {
add();
}
} class SynchronizedThread implements Runnable{ int count = 0; synchronized void add() {
count ++;
} @Override
public void run() {
add();
}
}

运行结果:

第1次:

DemoThread.count==9999

SynchronizedThread.count==10000

第2次:

DemoThread.count==10000

SynchronizedThread.count==10000

结果分析:

多个线程同时操作count资源,不加以同步关键字的控制,就会出现脏写的情况。

而Synchronized同步关键字,可以保证操作的原子性。

同步资源控制的三种方式:

1.方法上加同步关键字

2.方法内加同步关键字,控制整个对象资源

3.方法内加同步关键字,控制单一资源

实例:

package com.xm.thread.t_19_01_27;

import java.util.concurrent.TimeUnit;

public class SynchronizedDemo1 implements Runnable {

    private Object object = new Object();

    /**
* 1.同步关键字加在方法上
*/
synchronized void doing(){ } /**
* 2.方法内加同步关键字,控制整个对象资源
*/
void doing1() {
synchronized (this){ }
} /**
* 3.方法内加同步关键字,控制单一资源
*/
void doing2() {
synchronized (object) { }
} @Override
public void run() { }
}

分析:

第一种与第二种,效果相同。

第三种最为灵活高效,对哪个资源操作,就控制哪个资源。

5.同步关键字(synchronized)的更多相关文章

  1. 同步关键字synchronized

    同步关键字synchronized 同步关键字synchronized使用简洁,代码可维护性好.在JDK6中,性能也比早期的JDK有很大的改进.如果可以满足程序要求,应该首先考虑这种同步方式. 关键字 ...

  2. 新手向-同步关键字synchronized对this、class、object、方法的区别

    synchronized的语义 实验 分析 在看源代码时遇到多线程需要同步的时候,总是会看见几种写法,修饰方法.修饰静态方法.synchronized(Xxx.class).synchronized( ...

  3. Java中使用同步关键字synchronized需要注意的问题

    在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在 ...

  4. java多线程学习-同步(synchronized)

    (示例都是网上视频的) 假如两个线程同时调用一个方法输出字符串 public class SynchronizedTest extends Thread { public static void ma ...

  5. 多线程,线程同步,synchronized关键字的用法

    一.什么是多线程 Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorSe ...

  6. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  7. 多线程总结-同步之synchronized关键字

    目录 1.为什么要使用synchronized? 2.synchronized锁什么,加锁的目的是什么? 3.代码示例 3.1锁this和临界资源对象 3.2锁class类对象 3.3 什么时候锁临界 ...

  8. Java线程同步(synchronized)——卖票问题

    卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1, ...

  9. java多线程——同步块synchronized详解

    Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静 ...

随机推荐

  1. <%@ page isELIgnored="false"%>的作用

    JSP 2.0的一个主要特点是它支持表达语言(expression language).JSTL表达式语言可以使用标记格式方便地访问JSP的隐含对象和JavaBeans组件,JSTL的核心标记提供了流 ...

  2. div 旋转

    -webkit-transform:rotate(120deg); -moz-transform:rotate(120deg); -o-transform:rotate(120deg); /* fil ...

  3. JavaScript的重载(通过argument.length)

    偶然间在博客园看到的关于js的重载(重载就是一组具有相同名字.不同参数列表,实现不同操作的函数或方法)问题,作为初学者,在看红宝书的时候,记得书中有概念说明js是没有重载的 所以,觉得有必要把这一段 ...

  4. python 中 \n 和转义r的作用和\r的实际应用

    我们先看看这张转义字符图: 1. 知识储备 \r 表示将光标的位置回退到本行的开头位置 \b 表示将光标的位置回退一位 在 python 语言中, 使用 print 打印输出时,默认是会进行换行的.如 ...

  5. 2D平面中关于矩阵(Matrix)跟图形变换的讲解

    在二维平面上,常用的有以下三种基本的图形变化: 1)Translation 2)Scale 3)Rotation 在canvas的开发中,我们也经常会用到这样的一些图形变换,尤其是我们在写自定义Vie ...

  6. easyui扩展行默认展开 以及 去除滚动条

     问题背景: 在做打印页面的时候,要求有详细的默认展开显示.    遇到的问题: 1)在用扩展行的时候,grid的所有行都添加了展开收起的图标,(第二行没有明细)如下  2)默认展示有详细行的时候,内 ...

  7. Java入门到精通——调错篇之Astah Community打开报需要jre1.7运行环境

    1.问题概述     Astah Community安装完以后点击运行Astah Community的时候报此应用需要jdk1.7如下图     但是我的电脑在D盘装了jdk1.8了为什么这个软件为什 ...

  8. tensorflow: a Implementation of rotation ops (旋转的函数实现方法)

    tensorflow 旋转矩阵的函数实现方法 关键字: rot90, tensorflow 1. 背景 在做数据增强的操作过程中, 很多情况需要对图像旋转和平移等操作, 针对一些特殊的卷积(garbo ...

  9. Maven学习---使用maven进行项目构建

    1. 使用maven进行项目构建 MyEclipse 自带maven 插件 Eclipse 需要单独安装maven插件 1.1. Maven 在企业中怎么用的 ? Maven : 项目构建工具 ,进行 ...

  10. xtrabackup在线迁移mysql并搭建为主主同步

    一.背景 工作中有需求数据库需要迁移,但是不能停服,不能锁库锁表影响业务的正常运行,所以使用XtraBackup 二.环境: 操作系统:CentOS Linux release 7.4.1708 (C ...