Java多线程synchronized同步
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java多线程synchronized同步,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5396字,纯文字阅读大概需要8分钟。
内容图文
![Java多线程synchronized同步](/upload/InfoBanner/zyjiaocheng/1048/030d99a9e4f641e8ba98f51191333363.jpg)
非线程安全问题
“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”。也即是说,方法中的变量永远是线程安全的。
如果多个线程共同访问1个对象中的实例变量,则可能线程不安全。下面以实例说明
1 public class HasSelfNum { 2 private int num = 0; 3publicvoid add(String name) { 4try { 5if (name.equals("a")) { 6 num = 100; 7 System.out.println("a over"); 8 Thread.sleep(1000); 9 } else { 10 num = 200; 11 System.out.println("b over"); 12 } 13 System.out.println(name+" "+num); 14 } catch (InterruptedException e) { 15// TODO Auto-generated catch block16 e.printStackTrace(); 17 } 18 } 19 }
1 public class ThreadA extends Thread{ 2private HasSelfNum hasSelfNum; 3 4public ThreadA(HasSelfNum hasSelfNum) { 5this.hasSelfNum = hasSelfNum; 6 } 7 8 @Override 9publicvoid run() { 10super.run(); 11 hasSelfNum.add("a"); 12 } 13 }
1 public class ThreadB extends Thread{ 2private HasSelfNum hasSelfNum; 3 4public ThreadB(HasSelfNum hasSelfNum) { 5this.hasSelfNum = hasSelfNum; 6 } 7 8 @Override 9publicvoid run() { 10super.run(); 11 hasSelfNum.add("b"); 12 } 13 }
1 public class Main { 2 public static void main(String[] args) { 3 HasSelfNum hasSelfNum = new HasSelfNum(); 4 ThreadA threadA = new ThreadA(hasSelfNum); 5 ThreadB threadB = new ThreadB(hasSelfNum); 6 7 threadA.start(); 8 threadB.start(); 9 } 10 }
Result
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843102.jpg)
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843126.jpg)
1 a over 2 b over 3 b 200 4 a 200
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843102.jpg)
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843126.jpg)
1 a over 2 a 100 3b over 4 b 200
线程安全,同步访问add()方法
如果是 多个对象的情况?
将上面的Main.java进行修改
1 public class Main { 2 public static void main(String[] args) { 3 HasSelfNum hasSelfNum = new HasSelfNum(); 4 HasSelfNum hasSelfNum2 = new HasSelfNum(); //两个对象 5 6 ThreadA threadA = new ThreadA(hasSelfNum); 7 ThreadB threadB = new ThreadB(hasSelfNum2); 8 9 threadA.start(); 10 threadB.start(); 11 } 12 }
Result
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843102.jpg)
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843126.jpg)
1 a over 2 b over 3 b 200 4 a 100
若类中既有synchronized类型方法又有非synchronized类型方法
1 public class MyObject { 2 synchronized public void methodA(){ 3 try { 4 System.out.println(Thread.currentThread().getName()+" begin"); 5 Thread.sleep(1000); 6 System.out.println(Thread.currentThread().getName()+" end"); 7 } catch (InterruptedException e) { 8// TODO Auto-generated catch block 9 e.printStackTrace(); 10 } 11 } 1213publicvoid methodB(){ 14try { 15 System.out.println(Thread.currentThread().getName()+" begin"); 16 Thread.sleep(1000); 17 System.out.println(Thread.currentThread().getName()+" end"); 18 } catch (InterruptedException e) { 19// TODO Auto-generated catch block20 e.printStackTrace(); 21 } 22 } 2324 }
1 public class ThreadA extends Thread{ 2 MyObject myObject; 3public ThreadA(MyObject myObject) { 4this.myObject = myObject; 5 } 6 7 @Override 8publicvoid run() { 9super.run(); 10 myObject.methodA(); 11 } 12 }
1 public class ThreadB extends Thread{ 2 MyObject myObject; 3public ThreadB(MyObject myObject) { 4this.myObject = myObject; 5 } 6 7 @Override 8publicvoid run() { 9super.run(); 10 myObject.methodB(); 11 } 12 }
1 public class Main { 2 public static void main(String[] args) { 3 MyObject myObject = new MyObject(); 4 5 ThreadA threadA = new ThreadA(myObject); 6 ThreadB threadB = new ThreadB(myObject); 7 threadA.setName("A"); 8 threadB.setName("B"); 910 threadA.start(); 11 threadB.start(); 12 } 13 }
Result
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843102.jpg)
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843126.jpg)
1 A begin 2 B begin 3 B end 4 A end
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843102.jpg)
![技术分享](/upload/getfiles/default/2022/11/7/20221107104843126.jpg)
1 A begin 2 A end 3 B begin 4 B end
线程A、B以同步的方式执行对象中的两方法
synchronized同步代码块
1 public class MyObject { 2 synchronized public void methodA() { 3 try { 4 System.out.println(Thread.currentThread().getName() + " begin"); 5 Thread.sleep(1000); 6 System.out.println(Thread.currentThread().getName() + " end"); 7 } catch (InterruptedException e) { 8// TODO Auto-generated catch block 9 e.printStackTrace(); 10 } 11 } 12publicvoid methodB(MyObject myObject) { 13synchronized (myObject) { 14try { 15 System.out.println(Thread.currentThread().getName() + " begin"); 16 Thread.sleep(1000); 17 System.out.println(Thread.currentThread().getName() + " end"); 18 } catch (InterruptedException e) { 19// TODO Auto-generated catch block20 e.printStackTrace(); 21 } 22 } 23 } 24 }
1 public class ThreadA extends Thread{ 2 MyObject myObject; 3public ThreadA(MyObject myObject) { 4this.myObject = myObject; 5 } 6 7 @Override 8publicvoid run() { 9super.run(); 10 myObject.methodA(); 11 } 12 }
1 public class ThreadB extends Thread{ 2 MyObject myObject; 3public ThreadB(MyObject myObject) { 4this.myObject = myObject; 5 } 6 7 @Override 8publicvoid run() { 9super.run(); 10 myObject.methodB(myObject); 11 } 12 }
1 public class Main { 2 public static void main(String[] args) { 3 MyObject myObject = new MyObject(); 4 5 ThreadA threadA = new ThreadA(myObject); 6 ThreadB threadB = new ThreadB(myObject); 7 threadA.setName("A"); 8 threadB.setName("B"); 910 threadB.start(); 11 threadA.start(); 12 } 13 }
Result
1 B begin 2 B end 3 A begin 4 A end
《Java多线程编程核心技术》学习
原文:http://www.cnblogs.com/zhaoww/p/5827352.html
内容总结
以上是互联网集市为您收集整理的Java多线程synchronized同步全部内容,希望文章能够帮你解决Java多线程synchronized同步所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。