首页 / JAVA / Java多线程-43-同步代码块
Java多线程-43-同步代码块
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java多线程-43-同步代码块,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2580字,纯文字阅读大概需要4分钟。
内容图文
这篇学习java多线程中的同步代码块知识点,先不上来就去解释什么是同步。我们来思考下,什么场景下需要同步?当多线程并发,同时执行多段代码,我们希望某一段代码的执行过程中,CPU不要切换到其他线程工作,等这个代码块执行完才去干其他线程的活,这个时候就需要同步。字面不好理解,下面看看一个具体代码例子。
1.同步之前
在IDE里面敲这些代码,观察运行结果。
package thread;
public class Demo1_Sync {
public static void main(String[] args) {
final print p = new print();
new Thread() {
public void run(){
while(true) {
p.print1();
}
}
}.start();
new Thread() {
public void run(){
while(true) {
p.print2();
}
}
}.start();
}
}
class print {
public void print1() {
System.out.print("A");
System.out.print("n");
System.out.print("t");
System.out.print("h");
System.out.print("o");
System.out.print("n");
System.out.print("y");
System.out.print("\r\n");
}
public void print2() {
System.out.print("learn");
System.out.print("Java");
System.out.print("\r\n");
}
}
运行结果,我随机选择一些打印出来顺序不是我们想要的结果。
learnJava
learnJava
thony
Anthony
Anthony
Anthony
上面thony这个输出就有问题,我们肯定希望输出Anthony,也就是cpu在这个时刻,调度到别的线程上工作,造成没有输出Anthony的效果。这里问题就是,我希望两个线程执行过程中,先保证print1或者print2里面打印代码都一起执行,别一会执行print1里面打印其中几个字母就跑去执行print2打印。这个问题,我们就需要用到同步。
2.synchronized关键字来实现同步
在Java中,使用关键字synchronized加上一个锁对象,可以实现代码块同步。这个锁对象可以是任意对象,但是如果要同步,就要使用相同的锁对象,下面我们具体用代码来演示。
package thread;
public class Demo1_Sync {
public static void main(String[] args) {
final print p = new print();
new Thread() {
public void run(){
while(true) {
p.print1();
}
}
}.start();
new Thread() {
public void run(){
while(true) {
p.print2();
}
}
}.start();
}
}
class print {
Object o = new Object(); //新建一个任意的锁对象,任意的对象都可以
public void print1() {
synchronized(o) { //这里对象o不能使用匿名类对象new Object(),无法保证锁对象是同一个
System.out.print("A");
System.out.print("n");
System.out.print("t");
System.out.print("h");
System.out.print("o");
System.out.print("n");
System.out.print("y");
System.out.print("\r\n");
}
}
public void print2() {
synchronized(o) { //这里对象o不能使用匿名类对象new Object(),无法保证锁对象是同一个
System.out.print("learn");
System.out.print("Java");
System.out.print("\r\n");
}
}
}
运行之后,就不会出现乱序输出的情况,synchronized是Java中最长的一个关键字,就是在多线程并发中使用,用来实现代码块同步的。同步代码的好处就是,同一时间只执行一段代码,不会执行多段代码。被锁住的代码块没有执行完之前,不会执行下一段代码块,这样保证了顺序,实现了同步。
内容总结
以上是互联网集市为您收集整理的Java多线程-43-同步代码块全部内容,希望文章能够帮你解决Java多线程-43-同步代码块所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。