Java中synchronized的使用注意
来源:互联网 发布:并发编程实践 编辑:程序博客网 时间:2024/05/18 20:52
要实现两个线程中打印的内容不错乱。
直接上代码:
package com.example.sync;public class SyncTest {public static void main(String[] args) {final Show show = new Show();new Thread(new Runnable() {@Overridepublic void run() {while (true) {show.print1("codingishappy");}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {show.print2("lovethegirl");}}}).start();}static class Show {public synchronized void print1(String name) {for (int i = 0; i < name.length(); i++) {System.out.print(name.charAt(i));}System.out.println();}public synchronized static void print2(String name) {for (int i = 0; i < name.length(); i++) {System.out.print(name.charAt(i));}System.out.println();}}}
打印:
lovethegirshappy
可以看到这里打印的内容已经出现了错乱的,这个是我们不想出现的。
那么到底上面的代码出现了什么问题呢?其实上面的代码synchronized的使用上要注意一点,它必须要针对同一个对象,才能“锁住”代码块。
这里普通方法show1()使用的锁是类的实例,而static方法show2()使用的锁是Show.class字节码,这两个并非同一个对象。打个简单的比喻,
synchronized (xxx)这里的xxx对象就像一把锁,使用它将一个房价锁住其他人就不能进了。
改进只需要将show1的需要互斥的代码段,使用Show.class锁就可以了。
package com.example.sync;public class SyncTest {public static void main(String[] args) {final Show show = new Show();new Thread(new Runnable() {@Overridepublic void run() {while (true) {show.print1("codingishappy");}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {show.print2("lovethegirl");}}}).start();}static class Show {public void print1(String name) {synchronized (Show.class) {for (int i = 0; i < name.length(); i++) {System.out.print(name.charAt(i));}System.out.println();}}public synchronized static void print2(String name) {for (int i = 0; i < name.length(); i++) {System.out.print(name.charAt(i));}System.out.println();}}}
0 0
- Java中synchronized的使用注意
- Java中使用同步关键字synchronized需要注意的问题
- Java中synchronized的使用
- Java中synchronized注意点
- 使用synchronized的注意点
- Java中Synchronized和Lock的使用
- Java中Synchronized同步的使用
- Java中Synchronized和Lock的使用
- Java中synchronized的使用实例
- Java中Synchronized和Lock的使用
- Java中synchronized关键字的使用
- Java中synchronized使用的一点见解
- Java中Synchronized和Lock的使用
- java中synchronized的使用和理解
- 使用synchronized需要注意的一个问题
- Java多线程Synchronized的注意细节
- Java多线程Synchronized的注意细节
- Java多线程Synchronized的注意细节
- 在VS中添加lib的方法
- Codeforces 5B
- linux下mysql中文乱码和区分表名大小写
- 打印1到100之内的整数,但数字中包含7的要跳过,例如:17、27、71、72,最优解
- 软件设计师自我修炼1:如何让用户对软件产生依赖
- Java中synchronized的使用注意
- CVPR 2015深度学习回顾
- 给头视图添加个伸缩动画
- java操作mongodb(分页)
- 裴蜀定理及证明
- hunnu11562:The Triangle Division of the Convex Polygon(第n个卡特兰数取模)
- 【笔试】6、求其最大公约数和最小公倍数
- 黑马程序员--- objective-c 类的继承
- UITableView省市区字典