java synchronized块_Java多线程同步代码块Synchronized

Java多线程同步代码块Synchronized

Java中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保障原子性,可见性与有序性。

内部锁是通过synchronized关键字实现的.synchronized关键字修饰代码块,修饰该方法。

修饰代码块的语法:

synchronized( 对象锁 ) {

同步代码块,可以在同步代码块中访问共享数据

}

修饰实例方法就称为同步实例方法

修饰静态方法称称为同步静态方法

synchronized同步代码块

package com.wkcto.intrinsiclock;

/**

* synchronized同步代码块

* this锁对象

* Author: 老崔

*/

public class Test01 {

public static void main(String[] args) {

//创建两个线程,分别调用mm()方法

//先创建Test01对象,通过对象名调用mm()方法

Test01 obj = new Test01();

new Thread(new Runnable() {

@Override

public void run() {

obj.mm(); //使用的锁对象this就是obj对象

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

obj.mm(); //使用的锁对象this也是obj对象

}

}).start();

}

//定义方法,打印100行字符串

public void mm(){

synchronized ( this ) { //经常使用this当前对象作为锁对象

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

}

package com.wkcto.intrinsiclock;

/**

* synchronized同步代码块

* 如果线程的锁不同, 不能实现同步

* 想要同步必须使用同一个锁对象

* Author: 老崔

*/

public class Test02 {

public static void main(String[] args) {

//创建两个线程,分别调用mm()方法

//先创建Test01对象,通过对象名调用mm()方法

Test02 obj = new Test02();

Test02 obj2 = new Test02();

new Thread(new Runnable() {

@Override

public void run() {

obj.mm(); //使用的锁对象this就是obj对象

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

obj2.mm(); //使用的锁对象this也是obj2对象

}

}).start();

}

//定义方法,打印100行字符串

public void mm(){

synchronized ( this ) { //经常使用this当前对象作为锁对象

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

}

package com.wkcto.intrinsiclock;

/**

* synchronized同步代码块

* 使用一个常量对象作为锁对象

* Author: 老崔

*/

public class Test03 {

public static void main(String[] args) {

//创建两个线程,分别调用mm()方法

//先创建Test01对象,通过对象名调用mm()方法

Test03 obj = new Test03();

Test03 obj2 = new Test03();

new Thread(new Runnable() {

@Override

public void run() {

obj.mm(); //使用的锁对象OBJ常量

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

obj2.mm(); //使用的锁对象OBJ常量

}

}).start();

}

public static final Object OBJ = new Object(); //定义一个常量,

//定义方法,打印100行字符串

public void mm(){

synchronized ( OBJ ) { //使用一个常量对象作为锁对象

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

}

package com.wkcto.intrinsiclock;

/**

* synchronized同步代码块

* 使用一个常量对象作为锁对象,不同方法中 的同步代码块也可以同步

* Author: 老崔

*/

public class Test04 {

public static void main(String[] args) {

//创建两个线程,分别调用mm()方法

//先创建Test01对象,通过对象名调用mm()方法

Test04 obj = new Test04();

Test04 obj2 = new Test04();

new Thread(new Runnable() {

@Override

public void run() {

obj.mm(); //使用的锁对象OBJ常量

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

obj2.mm(); //使用的锁对象OBJ常量

}

}).start();

//第三个线程调用静态方法

new Thread(new Runnable() {

@Override

public void run() {

sm(); //使用的锁对象OBJ常量

}

}).start();

}

public static final Object OBJ = new Object(); //定义一个常量,

//定义方法,打印100行字符串

public void mm(){

synchronized ( OBJ ) { //使用一个常量对象作为锁对象

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

//定义方法,打印100行字符串

public static void sm(){

synchronized ( OBJ ) { //使用一个常量对象作为锁对象

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云明确生态边界:不做SaaS、被集成

“练好内功被集成&#xff0c;阿里云自己不做SaaS&#xff0c;让大家来做更好的SaaS。”3月21日&#xff0c;在2019阿里云峰会北京现场&#xff0c;阿里云智能总裁张建锋首次明确阿里云的生态边界和被集成战略。 大会舞台上&#xff0c;张建锋与20多位合作伙伴代表一一握手相迎…

windows mysql5.7 忘记root密码

编辑此文件 添加一行 skip-grant-tables重新启动mysql net stop mysql net start mysql跳过密码登陆 mysql -u root -p 直接按回车2次 修改密码 update mysql.user set authentication_stringpassword("root") where user"root";刷新权限 flush pri…

Docker容器资源管理,你真的学会了吗?

作者 | 张晋涛编辑 | 胡巍巍来源 | GitChat&#xff08;ID&#xff1a;GitChat&#xff09;Docker 上手很容易&#xff0c;但如果将其应用于生产环境&#xff0c;则需要对它有更深入的理解。只有这样&#xff0c;才能确保应用符合我们的预期&#xff0c;或在遇到问题时可及时解…

阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行

3月21日&#xff0c;在2019阿里云峰会北京站。特别转载一些来自媒体的报道&#xff0c;增加更多视角。 来自澎湃新闻&#xff0c;标题为《阿里所有技术和产品输出都将必须通过阿里云进行》 。 阿里巴巴旗下阿里云事业群升级为阿里云智能事业群后&#xff0c;3月21日&#xff0…

java封装原则_跟我学java编程—理解Java面向对象的封装原则

前面一节内容讲到了抽象与对象&#xff0c;抽象是把同类事物的共同特征抽取出来归纳为类&#xff0c;类的具体实例为对象。例如&#xff1a;把具有汁液多、糖分多、含有挥发性芳香物质、可以生食等特征的事物归纳为水果类&#xff0c;苹果、葡萄、生梨则为水果类的具体示例对象…

天桥调参师秘籍:一份深度学习超参微调技术指南

随着深度学习的兴起&#xff0c;越来越多的人从事算法工程师这一岗位。有时候他们自嘲自己为“天桥调参师”。当然&#xff0c;算法工程师的工作内容并没有那么简单&#xff0c;因为设置超参数的过程需要专业知识和广泛的试验和试错过程。尤其是针对学习率&#xff08;learning…

Springboot集成axis1.4

文章目录1. 引入依赖2. Servlet3.接口4.实现类5.配置工厂6.启动类7. server-config.wsdd8. 访问1. 引入依赖 <!--axis start --><dependency><groupId>org.apache.axis</groupId><artifactId>axis</artifactId><version>1.4</ver…

疫情面前,医院是否需要数据中台?

来源 | 亲爱的数据&#xff08;ID&#xff1a;deardata&#xff09;作者&#xff1a;谭婧&#xff0c;虎嗅认证作者&#xff0c;《亲爱的数据》公众号出品人&#xff0c;香港浸会大学硕士&#xff0c;N年前高考作文满分得主。曾负责中国节能集团控股企业战略管理工作&#xff0…

【机器学习PAI实战】—— 玩转人工智能之综述

绪论 人工智能并非新的术语&#xff0c;这个概念由来已久&#xff0c;大约从80年代初开始&#xff0c;计算机科学家们开始设计可以学习和模仿人类行为的算法。人工智能的发展曲折向前&#xff0c;伴随着数据量的上涨、计算力的提升&#xff0c;机器学习的火热&#xff0c;以及…

java 设计模式 prototype_Java设计模式之Prototype原型模式

一、场景描述创建型模式中&#xff0c;从工厂方法模式&#xff0c;抽象工厂模式&#xff0c;到建造者模式&#xff0c;再到原型模式&#xff0c;我的理解是&#xff0c;创建对象的方式逐步从编码实现转向内存对象处理。例如&#xff0c;在“仪器数据采集器”的子类/对象“PDF文…

一文纵览EMAS 到底内含多少阿里核心技术能力

EMAS的整体定位是阿里巴巴移动技术对外输出的主窗口&#xff0c;沉淀了阿里巴巴近10年在移动互联网技术架构上的积累以及在一系列垂直场景中所实践的核心技术能力。一方面&#xff0c;EMAS希望为广大开发者提供安全、稳定、快速、弹性的移动应用基础设施&#xff0c;另一方面也…

解决Windows中PLSQL连接虚拟机中Oracle缓慢的问题

文章目录1. 原因分析2. 解决方法1. 原因分析 Linux系统中的DNS解析在寻址的时候出现“错误”。这个跟我在用桥接模式连接网络的时候&#xff0c; 错误配置了“Network Configuration”中的DNS有关&#xff08;在用Bridged模式联网时&#xff0c;可以不 用配置DNS&#xff09;。…

万字长文!Unix和Linux你不知道的那些历史(详解版)

作者 | 程序员小乐来源 | 程序员小乐&#xff08;ID:study_tech&#xff09;00 前言 UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服务器端操作系统中&#xff0c;UNIX 诞生于 20 世纪 60 年代末&#xff0c;Windows 诞生于 20 世纪 80 年代中期&#xff0c;…

“阿里巴巴小程序繁星计划”:20亿扶持200万小程序开发者和100万商家

3月21日&#xff0c;在2019阿里云峰会北京站上&#xff0c;阿里巴巴旗下的阿里云、支付宝、淘宝、钉钉、高德等联合发布“阿里巴巴小程序繁星计划”&#xff1a;提供20亿元补贴&#xff0c;扶持200万小程序开发者、100万商家。凡入选“超星”的小程序&#xff0c;入驻支付宝、淘…

java ip输入框_JavaScript实现IP地址的输入框方式

1 2 3 4 JScript实现的IP地址输入框5 6 7 8 .ip_input{width:20px;height:16px;font:normal 12px 宋体;color:#000000;border:0px;text-align:center;position:relative;top:1px; }9 .all_input{width:112;height:20px;font:normal 8px 宋体;color:#000000;border:1px solid #0…

linux 如何搭建sftp服务器

sftp采用的是ssh加密隧道&#xff0c;安装性方面较ftp强&#xff0c;而且依赖的是系统自带的ssh服务&#xff0c;不像ftp还需要额外的进行安装 文章目录一、服务器搭建分配二、sftp服务器搭建1. 创建sftp组2. 用户组3. 绑定用户组4. 配置5. 目录权限6. 用户、用户组、权限7. 关…

只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型

在生产环境中部署机器学习模型是数据工程中经常被忽视的领域。网上的大多数教程/博客都侧重于构建、训练和调整机器学习模型。如果它不能用于实际的预测&#xff0c;那么它又有什么用呢&#xff1f; 接下来了解一下有哪些部署选项吧&#xff1a;评估选项 在生产中部署机器学习模…

ftp工具类

文章目录1.依赖2. 工具类2. 业务处理类1.依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.56</version></dependency><dependency><groupId>commons-net</gro…

java调用qq接口_用java代码怎么去请求腾讯接口并返回值

这是参看代码&#xff0c;你看一下&#xff0c;里面的HttpClient包你要自己去下public static void main(String[] args) {CloseableHttpClient httpclient HttpClients.createDefault();String url "http://m.weather.com.cn/data/101200101.html";URI uri URI.c…

刚发布!新型病毒下,程序员可在家免费学习了!

亲爱的CSDN家人们&#xff1a;疫情当前&#xff0c;这个春节有点“寒”。截止1月31号24时&#xff0c;新型冠状病毒在全国已确诊11791名&#xff08;数字取自&#xff1a;人民日报8:40分发布信息&#xff09;&#xff0c;疑似病例已1w&#xff0c;受其影响&#xff0c;全国各地…