Synchronized 关键字的用法


第一条:当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程对该对象的该synchronized方法或者synchronized代码块的访问将被阻塞。

public class MoreThread {public static void main(String[] args) {Piao piao = new Piao();Thread t1 = new Thread(piao);Thread t2 = new Thread(piao);Thread t3 = new Thread(piao);t1.start();t2.start();t3.start();}
}class Piao implements Runnable {@Overridepublic void run() {/*synchronized(this) {*/for (int i = 0; i < 10; i++) {try {Thread.sleep(100);System.out.println(Thread.currentThread().getName() + " 卖票:ticket " + i);} catch (InterruptedException e) {e.printStackTrace();}}/*}*/}
}

  没有加上synchronized:

Thread-1 卖票:ticket 0
Thread-0 卖票:ticket 0
Thread-2 卖票:ticket 0
Thread-1 卖票:ticket 1
Thread-0 卖票:ticket 1
Thread-2 卖票:ticket 1
Thread-1 卖票:ticket 2
Thread-0 卖票:ticket 2
Thread-2 卖票:ticket 2
Thread-1 卖票:ticket 3
Thread-0 卖票:ticket 3
Thread-2 卖票:ticket 3
Thread-0 卖票:ticket 4
Thread-2 卖票:ticket 4
Thread-1 卖票:ticket 4
Thread-2 卖票:ticket 5
Thread-0 卖票:ticket 5
Thread-1 卖票:ticket 5
Thread-1 卖票:ticket 6
Thread-2 卖票:ticket 6
Thread-0 卖票:ticket 6
Thread-1 卖票:ticket 7
Thread-0 卖票:ticket 7
Thread-2 卖票:ticket 7
Thread-1 卖票:ticket 8
Thread-0 卖票:ticket 8
Thread-2 卖票:ticket 8
Thread-1 卖票:ticket 9
Thread-2 卖票:ticket 9
Thread-0 卖票:ticket 9

  加上synchronized:这个代码块要等一个线程访问完成之后,另一个线程才能访问。

Thread-1 卖票:ticket 0
Thread-1 卖票:ticket 1
Thread-1 卖票:ticket 2
Thread-1 卖票:ticket 3
Thread-1 卖票:ticket 4
Thread-1 卖票:ticket 5
Thread-1 卖票:ticket 6
Thread-1 卖票:ticket 7
Thread-1 卖票:ticket 8
Thread-1 卖票:ticket 9
Thread-0 卖票:ticket 0
Thread-0 卖票:ticket 1
Thread-0 卖票:ticket 2
Thread-0 卖票:ticket 3
Thread-0 卖票:ticket 4
Thread-0 卖票:ticket 5
Thread-0 卖票:ticket 6
Thread-0 卖票:ticket 7
Thread-0 卖票:ticket 8
Thread-0 卖票:ticket 9
Thread-2 卖票:ticket 0
Thread-2 卖票:ticket 1
Thread-2 卖票:ticket 2
Thread-2 卖票:ticket 3
Thread-2 卖票:ticket 4
Thread-2 卖票:ticket 5
Thread-2 卖票:ticket 6
Thread-2 卖票:ticket 7
Thread-2 卖票:ticket 8
Thread-2 卖票:ticket 9

  


第二条:当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程仍然可以访问该对象的非同步代码块。

 1 public class MoreThread {
 2     public static void main(String[] args) {
 3         TestSynchronized t = new TestSynchronized();
 4         Thread t1 = new Thread(() -> t.SynMethod());
 5         Thread t2 = new Thread(() -> t.NoSynMethod());
 6 
 7         t1.start();
 8         t2.start();
 9     }
10 
11 }
12 class TestSynchronized {
13 
14     public void SynMethod() {
15         synchronized (this) {
16             try {
17                 for (int i = 0; i < 5; i++) {
18                     Thread.sleep(1000); // 休眠100ms
19                     System.out.println(Thread.currentThread().getName() + " synMethod loop " + i);
20                 }
21             } catch (InterruptedException ie) {
22             }
23         }
24     }
25 
26     public void NoSynMethod() {
27         synchronized (this) {
28             try {
29                 for (int i = 0; i < 5; i++) {
30                     Thread.sleep(1000); // 休眠100ms
31                     System.out.println(Thread.currentThread().getName() + " synMethod loop " + i);
32                 }
33             } catch (InterruptedException e) {
34                 e.printStackTrace();
35             }
36         }
37     }

当线程 t1去调用含有synchronized()的时候,会获取到对象的同步锁(每一个对象有且只有一个同步锁)。此时线程 t2 可以去调用没有synchronized修饰的代码块。不会发生阻塞。执行结果会交叉执行

 1 Thread-0 synMethod loop 0
 2 Thread-1 synMethod loop 0
 3 Thread-0 synMethod loop 1
 4 Thread-1 synMethod loop 1
 5 Thread-0 synMethod loop 2
 6 Thread-1 synMethod loop 2
 7 Thread-1 synMethod loop 3
 8 Thread-0 synMethod loop 3
 9 Thread-1 synMethod loop 4
10 Thread-0 synMethod loop 4
11 
12 Process finished with exit code 0

如果给方法中加上synchroniezd(this) 那么线程t2在执行的时候会发生阻塞。会等一个线程执行完后,释放锁后,另一线程才会运行

 1 Thread-1 synMethod loop 0
 2 Thread-1 synMethod loop 1
 3 Thread-1 synMethod loop 2
 4 Thread-1 synMethod loop 3
 5 Thread-1 synMethod loop 4
 6 Thread-0 synMethod loop 0
 7 Thread-0 synMethod loop 1
 8 Thread-0 synMethod loop 2
 9 Thread-0 synMethod loop 3
10 Thread-0 synMethod loop 4
11 
12 Process finished with exit code 0

 


第三条:当一个线程访问某对象的synchronized方法或者synchronized代码块时,其他线程对该对象的其他的synchronized方法或者synchronized代码块的访问将被阻塞。

from:https://blog.csdn.net/wanliguodu/article/details/81005560

https://blog.csdn.net/wanliguodu/article/details/81154294

转载于:https://www.cnblogs.com/huoyufei/p/11287576.html

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

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

相关文章

研究速递:预测学习——神经元高效运作的最佳策略

来源&#xff1a;集智俱乐部作者&#xff1a;袁郭玲、梁金编辑&#xff1a;邓一雪摘要了解大脑如何学习有助于制造具有与人类类似智力水平的机器。之前有理论提出&#xff0c;大脑可能是根据预测编码的原理运行。然而&#xff0c;对于预测系统如何在大脑中实现还没有很好的解释…

Element-UI-快速入门(极简教程)

文章目录4. ElementUI4.1 ElementUI介绍4.2 常用组件4.2.1 Container 布局容器4.2.2 Dropdown 下拉菜单4.2.3 NavMenu 导航菜单4.2.4 Table 表格4.2.5 Pagination 分页4.2.6 Message 消息提示4.2.7 Tabs 标签页4.2.8 Form 表单4. ElementUI 4.1 ElementUI介绍 ElementUI是一套…

centos 6.5 防火墙开放指定端口

清除防火墙规则&#xff1a;iptables -F 关闭防火墙 /etc/init.d/iptables stop 关闭防火墙开机自启&#xff1a;chkconfig iptables off 查看iptables 是否开启&#xff1a;Chkconfig –list | grep iptables iptables 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:关闭 6:关…

破解人工智能系统的四种攻击方法!

来源&#xff1a;未来科技前沿没有人喜欢早上起床&#xff0c;但现在人工智能驱动的算法可以设置我们的闹钟、管理我们家中的温度设置以及选择适合我们心情的播放列表&#xff0c;贪睡按钮的使用越来越少。人工智能安全辅助系统使我们的车辆更安全&#xff0c;人工智能算法优化…

PowerDesigner-快速入门(极简教程)

文章目录3. PowerDesigner3.1 PowerDesigner介绍3.2 PowerDesigner使用3.2.1 创建物理数据模型3.2.2 从PDM导出SQL脚本3.2.3 逆向工程3.2.4 生成数据库报表文件3. PowerDesigner 3.1 PowerDesigner介绍 PowerDesigner是Sybase公司的一款软件&#xff0c;使用它可以方便地对系…

关于dev无法更新、调试的问题

转载于:https://www.cnblogs.com/IcefishBingqing/p/5109876.html

MIT发布白皮书:美国欲重返世界半导体霸主!

来源&#xff1a;新智元编辑&#xff1a;时光 David近年来&#xff0c;全球芯片的持续性短缺已引发了一连串的产能瓶颈问题。各种消费品的价格都随着「缺芯」而上升&#xff0c;从CPU到显卡&#xff0c;从智能冰箱到SUV&#xff0c;这凸显出半导体在日常生活种所扮演的重要作用…

dubbo-快速入门-分布式RPC框架Apache Dubbo

文章目录分布式RPC框架Apache Dubbo1. 软件架构的演进过程1.1 单体架构1.2 垂直架构1.3 SOA架构1.4 微服务架构2. Apache Dubbo概述2.1 Dubbo简介2.2 Dubbo架构3. 服务注册中心Zookeeper3.1 Zookeeper介绍3.2 安装Zookeeper3.3 启动、停止Zookeeper4. Dubbo快速入门4.1 服务提供…

mysql数据库之忘记root密码

1. vi /etc/my.cnf&#xff0c;在[mysqld]中添加 skip-grant-tables 例如&#xff1a; [mysqld] skip-grant-tables datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock 2. 重启mysql service mysql restart 3. 使用用户无密码登录 mysql -uroot -p (直接点击回车&…

可构建AI的“AI”诞生:几分之一秒内,就能预测新网络的参数

来源&#xff1a;学术头条 作者&#xff1a;Anil Ananthaswamy译者&#xff1a;刘媛媛原文出处&#xff1a;quantamagazine.org人工智能在很大程度上是一场数字游戏。当深度神经网络在 10 年前开始超越传统算法&#xff0c;是因为我们终于有了足够的数据和处理能力来充分利用它…

linux-01-概述

文章目录入门概述走近Linux系统入门概述 我们为什么要学习Linux linux诞生了这么多年&#xff0c;以前还喊着如何能取代windows系统&#xff0c;现在这个口号已经小多了&#xff0c;任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样&#xff0…

MySQL-Front的安装简介

本博文在作者的个人网站、博客园和CSDN同步发表&#xff0c;如要转载&#xff0c;请标明原作者和出处。 最近在学习MySQL数据库&#xff0c;开始的时候使用的Windows的命令行进行最基本的代码的输入&#xff0c;可是后来就觉得比较麻烦了&#xff0c;于是想找一款图形化数…

生命是什么?生物化学、物理学、哲学对生命本源的共同探索

来源&#xff1a; 集智俱乐部作者&#xff1a;Mark A. Bedua译者&#xff1a;宋词、范星辰 审校&#xff1a;周理乾、梁金编辑&#xff1a;邓一雪导语地球上充盈着生命&#xff0c;通常我们很容易分辨哪些是生命&#xff0c;哪些不是生命。可是&#xff0c;关于生命是什么&…

linux-02-常用的命令-必须掌握

文章目录目录管理基本属性文件内容查看目录管理 绝对路径和相对路径 我们知道Linux的目录结构为树状结构&#xff0c;最顶级的目录为根目录 /。 其他目录通过挂载可以将它们添加到树中&#xff0c;通过解除挂载可以移除它们。 在开始本教程前我们需要先知道什么是绝对路径与相…

上交大许志钦:神经网络中的奥卡姆剃刀——简单有效原理

来源&#xff1a; 智源社区作者&#xff1a;许志钦整理&#xff1a;熊宇轩编辑&#xff1a;李梦佳本文整理自青源Talk第十期&#xff0c;视频回看地址&#xff1a;https://event.baai.ac.cn/activities/217【专栏&#xff1a;研究思路】奥卡姆剃刀是由14世纪方济会修士奥卡姆的…

CSS每日学习笔记(3)

8.1.2019 1.CSS伪类&#xff1a;用于向某些选择器添加特殊的效果。 伪类的语法&#xff1a; selector : pseudo-class {property: value} CSS 类也可与伪类搭配使用。 a.red : visited {color: #FF0000} <a class"red" href"css_syntax.asp">CSS Syn…

linux-03-Vim使用+账号用户管理

什么是Vim编辑器 Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。 vim 则…

孙正义:未来30年投资趋势【附PPT】

来源&#xff1a;投资家、蓝血研究&#xff08;lanxueyanjiu)作者&#xff1a;孙正义对于今后30年来讲&#xff0c;我认为现在是个很关键的时刻&#xff0c;尤其是在各位的人生当中。而且现在是一整个概念的转变&#xff0c;我们要包容这个概念的转变。我想先给大家看两张照片。…

php 计算指定年份的周总数与及第几周的开始日期和结束日期(从周一开始)

/** * 获取某年第几周的开始日期和结束日期 * param int $year * param int $week 第几周; */ public function weekday($year,$week1){ $year_start mktime(0,0,0,1,1,$year); $year_end mktime(0,0,0,12,31,$year); // 判断第一天是否为第一周的开始 if (intval(d…

linux-04-磁盘命令+进程命令

磁盘管理 概述 Linux磁盘管理好坏直接关系到整个系统的性能问题。 Linux磁盘管理常用命令为 df、du。 df &#xff1a;列出文件系统的整体磁盘使用量du&#xff1a;检查磁盘空间使用量 df df df命令参数功能&#xff1a;检查文件系统的磁盘空间占用情况。可以利用该命令来获…