同步关键字(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. Could not open php://output for writing.问题解决

    这是一个自己在项目中遇到的问题. 由于一直以来,公司都是用的Linux服务器,这次为客户做项目,换成了winserver. 项目中有一项功能是Excel导出,采用PHPEXCEL类库实现.由于是个小项 ...

  2. Windows下etc文件夹

    etc etcetera[ɛtsɛtərə]缩写 等等的意思 放置一些其他文件

  3. js中的this--执行上下文

    条件:函数调用的时候  才有执行上下文 this 不同情况的调用,this也不同 1)当函数直接打点调用,此时的this 是window 2)事件触发函数,此时的this是触发这个事件的对象 3)当对 ...

  4. C语言归并排序

    这篇文章是学习了小甲鱼-数据结构与算法结合自考教材编写出的代码,希望自己逐渐在算法造诣上能更上一层楼. 归并排序(递归实现) “归并”一词在中文含义中就是合并的意思,而在数据结构中的定义是将两个或者两 ...

  5. 精通Groovy

    https://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html https://juejin.im/entry/ ...

  6. css零星进阶知识点

    display: inline-block: 可设置宽高的行级元素,如果inline-block元素本行无法显示完全的话则整个换行而不是里面的单词换行 position: 设置参照物,top,left ...

  7. 【NLP汉语自然语言处理与实践】分词_笔记

    一.两种分词标准: 1. 粗粒度. 将词作为最小基本单位.比如:浙江大学. 主要用于自然语言处理的各种应用. 2. 细粒度. 不仅对词汇继续切分,也对词汇内部的语素进行切分.比如:浙江/大学. 主要用 ...

  8. Java程序中解决数据库超时与死锁

    Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T   Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况 ...

  9. Centos7开放端口

    Centos7开放端口 Centos升级到7之后,发现无法使用iptables控制Linuxs的端口,google之后发现Centos 7使用firewalld代替了原来的iptables.下面记录如 ...

  10. 如何申请免费域名证书,以及在IIS上绑定

    1.前往https://freessl.cn/ 申请域名 证书 2.输入邮箱后,点击创建.文件验证方式 会自动下载一个压缩包,把该压缩包放到所申请的域名首层下.(不要重复创建,需要3,5分钟.最好手动 ...