5.同步关键字(synchronized)
同步关键字(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)的更多相关文章
- 同步关键字synchronized
同步关键字synchronized 同步关键字synchronized使用简洁,代码可维护性好.在JDK6中,性能也比早期的JDK有很大的改进.如果可以满足程序要求,应该首先考虑这种同步方式. 关键字 ...
- 新手向-同步关键字synchronized对this、class、object、方法的区别
synchronized的语义 实验 分析 在看源代码时遇到多线程需要同步的时候,总是会看见几种写法,修饰方法.修饰静态方法.synchronized(Xxx.class).synchronized( ...
- Java中使用同步关键字synchronized需要注意的问题
在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在 ...
- java多线程学习-同步(synchronized)
(示例都是网上视频的) 假如两个线程同时调用一个方法输出字符串 public class SynchronizedTest extends Thread { public static void ma ...
- 多线程,线程同步,synchronized关键字的用法
一.什么是多线程 Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorSe ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- 多线程总结-同步之synchronized关键字
目录 1.为什么要使用synchronized? 2.synchronized锁什么,加锁的目的是什么? 3.代码示例 3.1锁this和临界资源对象 3.2锁class类对象 3.3 什么时候锁临界 ...
- Java线程同步(synchronized)——卖票问题
卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1, ...
- java多线程——同步块synchronized详解
Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) 实例方法同步 静 ...
随机推荐
- JBPM学习第5篇:Mysql配置
1.工作台用户Authentication配置 JBPM web工作台预安装了用户认证与授权模块,位于jbpm-console-7.1.0.Final-wildfly-10.1.0.Final.war ...
- php字符集转换
PHP通过iconv将字符串从GBK转换为UTF8字符集. 1. iconv()介绍 iconv函数可以将一种已知的字符集文件转换成另一种已知的字符集文件.例如:从GB2312转换为UTF-8. ic ...
- 多实例部署多个tomcat
注意点: 1.多实例tomcat的更新维护,需要考虑如何能“优雅”地对所有实例进行升级: 2.尽量不要影响应用程序,在更新tomcat时,一不小心就把conf目录等全部覆盖,所以尽量要把配置文件和安装 ...
- Scarpy+selenium 结合使用
首先要先在spider对象实例化时,同时实例化一个浏览器对象 # -*- coding: utf-8 -*- import scrapy from selenium import webdriver ...
- 子div设置float后会导致父div无法自动撑开
本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 注: 文章部分转载 彩泉 - 博客园 原因:内部的DIV因为float:l ...
- RN记录
react-native run-android 出现 java.lang.nullpointerexception(no error message) 错误 删除 工程目录\android.grad ...
- 服务器端渲染VS浏览器端渲染
1)浏览器渲染和服务器渲染区别:何为渲染?如果我们只是想显示一堆不变的数据,那么我们直接写一个a.html丢到服务器上让客户端访问就可以了.但这是基本不可能的事情,数据一般是变化的.你不可能为每套数据 ...
- Java 开源博客 Solo 1.4.0 发布 - 简化
Solo 1.4.0 正式发布了!这个版本主要是简化了配置项,修复了一些缺陷并改进了很多细节体验,感谢一直以来关注和支持我们的朋友! 只需一个命令即可启动(不需要安装数据库.部署容器):也可以通过 w ...
- jQuery对html元素取值与赋值
以下总结了常用的jQuery选择器对html元素取值与赋值 Textbox: var str = $('#txt').val(); $('#txt').val("Set Lbl Value ...
- ASICS各跑鞋分类及选购方法
从跑吧转来的,老帖子后面的鞋子可能不能与时俱进 不过前面的方法不错. 1简介: ASICS鞋子鞋底如果有AHAR或AHAR+的为超耐磨标志,而且超耐度一般都是黑色,用指甲刮鞋底时如刮车轮底胶.ASIC ...