多线程-同步代码块

本是古典 何须时尚 2022-06-10 00:47 380阅读 0赞

如果一个对象作为同步代码块的对象,那么该对象同步的代码段和该对象内部通过同步方法或者自身对象的代码段会被同步。

看例子:

  1. public class OutClass {
  2. static class InnerClass1{
  3. public void method1(InnerClass2 class2){
  4. String threadName=Thread.currentThread().getName();
  5. synchronized (class2){
  6. System.out.println(threadName+" 进入InnerClass1类中的method1方法");
  7. for(int i=0;i<10;i++){
  8. System.out.println("i="+i);
  9. /* try {
  10. //Thread.sleep(100);
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }*/
  14. }
  15. System.out.println(threadName+" 离开InnerClass1类中的method1方法");
  16. }
  17. }
  18. public synchronized void method2(){
  19. String threadName=Thread.currentThread().getName();
  20. System.out.println(threadName+" 进入InnerClass1类中的method2方法");
  21. for(int j=0;j<10;j++){
  22. System.out.println("i="+j);
  23. try {
  24. Thread.sleep(100);
  25. } catch (InterruptedException e) {
  26. }
  27. }
  28. System.out.println(threadName+" 离开InnerClass1类中的method2方法");
  29. }
  30. }
  31. static class InnerClass2{
  32. public synchronized void method1(){
  33. String threadName=Thread.currentThread().getName();
  34. System.out.println(threadName+" 进入InnerClass2类中的method1方法");
  35. for(int k = 0;k<10;k++ ){
  36. System.out.println("k="+k);
  37. try {
  38. Thread.sleep(100);
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. System.out.println(threadName+" 离开InnerClass2类中的method1方法");
  44. }
  45. }
  46. }
  47. public class Run {
  48. public static void main(String[] args){
  49. final OutClass.InnerClass1 in1=new OutClass.InnerClass1();
  50. final OutClass.InnerClass2 in2=new OutClass.InnerClass2();
  51. Thread t1=new Thread(new Runnable() {
  52. @Override
  53. public void run() {
  54. in1.method1(in2);
  55. }
  56. },"T1");
  57. Thread t2=new Thread(new Runnable() {
  58. @Override
  59. public void run() {
  60. in1.method2();
  61. }
  62. },"T2");
  63. Thread t3=new Thread(new Runnable() {
  64. @Override
  65. public void run() {
  66. in2.method1();
  67. }
  68. },"T3");
  69. t1.start();
  70. t2.start();
  71. t3.start();
  72. }
  73. }

T2 进入InnerClass1类中的method2方法
T1 进入InnerClass1类中的method1方法
i=0
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
T1 离开InnerClass1类中的method1方法
T3 进入InnerClass2类中的method1方法
k=0
k=1
i=1
i=2
k=2
i=3
k=3
k=4
i=4
k=5
i=5
i=6
k=6
k=7
i=7
i=8
k=8
k=9
i=9
T2 离开InnerClass1类中的method2方法
T3 离开InnerClass2类中的method1方法

in2.method1方法一定要等到in1.method1方法执行完后才执行。

发表评论

表情:
评论列表 (有 0 条评论,380人围观)

还没有评论,来说两句吧...

相关阅读