同步关键字(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. (1-3)line-height与图片的表现

    (1-3)line-height与图片的表现 这篇文章真的很重要,耐心看,重中之重. 一.行高和图片的表现 图片和行高有什么歪腻呢?? 很多人不明白,为什么我图片好好的放在一个标签里面它就出现了如下问 ...

  2. 01.php面向对象

    下面是php_oop的一些基本知识 <?php //echo "<meta charset='utf-8'>" //设置中文输出 //1.面向对象类的建立: cl ...

  3. easyui 删除行的时候 引起的 bug

    问题场景 easyui 编辑里 有删除行的功能 文档提供的方法如下 $aplgrid为grid 的容器 ind 为当前行的索引 $aplgrid.datagrid('deleteRow', ind); ...

  4. 广告点击率预测(CTR) —— 在线学习算法FTRL的应用

    FTRL由google工程师提出,在13的paper中给出了伪代码和实现细节,paper地址:http://www.eecs.tufts.edu/~dsculley/papers/ad-click-p ...

  5. Tesseract-OCR-03-图片文字识别

    Tesseract-OCR-03-图片文字识别 本篇介绍使用 Tesseract-OCR 做图片文字识别,识别手写文字的时候,正确率能达到 90%,当训练后正确率是极高的.这里介绍的图片文字识别,可以 ...

  6. 目前比较全的CSS重设(reset)方法总结(转)

    原文地址 在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈 ...

  7. Studying TCP's Congestion Window using NS

    Studying TCP's Congestion Window using NS How to obtain TCP's CWND value The most important value th ...

  8. redis三节点sentinel部署

    角色          ip       port master      127.0.0.1  6379  slave-1     127.0.0.1  6380  slave-2     127. ...

  9. 魅族首页导航效果(不兼容IE)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  10. ZOJ-3286 Very Simple Counting---因子数打表

    题目链接: https://cn.vjudge.net/problem/ZOJ-3286 题目大意: f(n)为n的因子个数 求出有多少个f(i)使得f(i) == f(n) && i ...