java SE学习之线程同步(详细介绍)

       java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题:

              当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个程序是该如何执行?

             也就是先访问这个变量还是先修改这个变量.

             在学习线程的这段时间里,我也一直被这个问题所困扰!但是今天终于算是搞明白了.

             于是将这些好的列子一一列举出来,分享一下.

(1)什么是线程同步 ?

           线程同步是所有的线程同时段同时运行吗?  回答是: “当然不是”,

          那么什么是线程同步勒? 线程同步就是若干个线程都需要使用一个synchronized(同步的意思)修饰的方法,即程序中的若干个

    线程都需要使用一个方法,而这个方法用synchronized给与了修饰。同时多个线程调用synchronized方法必须要遵守同步机制(引自《java 2 使用教程》)

        而所说的同步机制其实就是: 当一个线程在使用synchronized方法时,其他线程得等到这个使用完这个synchronized方法时才可以去使用。好比一个队列,要等到前面一个完成了,下面一个才可以继续的意思..可见线程同步,并非我们所的所有线程同时段执行同一个事件、

 (2)举列子:  在一个工地上,有两个人分别为甲和乙 ,甲负责搬砖,乙负责砌墙。甲要保证乙时刻都有砖可以砌墙.......

      (每一个程序员,都是上辈子折了翅膀的天使!,搬砖的也是,砌砖的也是,呜呜呜呜)。

 1 //package DEMO;
 2 
 3 public class chenxiyuan {
 4 
 5     public static void main(String args [])
 6     {
 7         WorkPlace worker ;
 8         worker = new WorkPlace();
 9         worker.setBrick(30);   //假设刚开始的时候有30块砖
10        Thread jiawork ,yiwork;
11        jiawork =new Thread(worker);  // 组合
12        yiwork = new Thread(worker);
13        jiawork.setName("搬砖工");
14        jiawork.start();
15        yiwork.setName("砌砖工");
16        yiwork.start();
17     }
18 }
19 
20 class WorkPlace implements Runnable
21 {
22     int  BrickNumber=0;   //码放的砖头的数目
23     public void setBrick(int bricks)
24     {
25       BrickNumber=bricks;
26     }
27     public void run() {
28         // TODO Auto-generated method stub
29        String name = Thread.currentThread().getName();
30        
31        if(name.equals("搬砖工")) ;
32        else 
33            ;
34       }
35     //使用synchronized修饰方法
36     public synchronized void WORK(int bricks)
37     {
38         String name = Thread.currentThread().getName();
39         if(name.equals("搬砖工"))
40         {
41             while(BrickNumber<100&&BrickNumber>=0)
42             {
43                 System.out.println("我呵了个呵 ,距离休息还差: "+(100-
44 
45 BrickNumber)+"块砖 !");
46                 System.out.println("奶奶的,工头不再,赶紧头下懒.....
47 
48 (*^__^*) !");
49                  try {
50                         Thread.sleep(500);
51                 } catch (InterruptedException e) {
52                     // TODO Auto-generated catch block
53                     e.printStackTrace();
54                 }
55                
56                 BrickNumber+=bricks;
57             }
58             System.out.println("哇咔咔,终于忙完了!");
59         }
60         else 
61         {
62               System.out.println("------又要开始砌砖了!呜 呜 呜 -------");
63              while(BrickNumber>0)
64              {
65                  System.out.println("距离完工还有: "+BrickNumber+" 块砖没搞完");
66                   BrickNumber-=bricks;
67              }
68              System.out.println("忙完咯! 可以去领工资啦! 欧耶.....!");
69         }
70     }    
71 }

效果图:

       如果我们去掉synchronized修饰的又会是什么情况勒?  :-)

 1 public class chenxiyuan {
 2 
 3     public static void main(String args [])
 4     {
 5         WorkPlace worker ;
 6         worker = new WorkPlace();
 7         worker.setBrick(30);   //假设刚开始的时候有30块砖
 8        Thread jiawork ,yiwork;
 9        jiawork =new Thread(worker);  // 组合
10        yiwork = new Thread(worker);
11        jiawork.setName("搬砖工");
12        jiawork.start();
13        yiwork.setName("砌砖工");
14        yiwork.start();
15     }
16 }
17 
18 class WorkPlace implements Runnable
19 {
20     int  BrickNumber=0;   //码放的砖头的数目
21     public void setBrick(int bricks)
22     {
23       BrickNumber=bricks;
24     }
25     public void run() {
26         // TODO Auto-generated method stub
27        String name = Thread.currentThread().getName();
28        
29        if(name.equals("搬砖工")) WORK(20);
30        else  WORK(30) ;
31       }
32     //使用synchronized修饰方法
33     public void WORK(int bricks)
34     {
35         String name = Thread.currentThread().getName();
36         if(name.equals("搬砖工"))
37         {
38             while(BrickNumber<100&&BrickNumber>=0)
39             {
40                 System.out.println("我呵了个呵 ,距离休息还差: "+(100-
41 
42 BrickNumber)+"块砖 !");
43                 System.out.println("奶奶的,工头不再,赶紧头下懒.....
44 
45 (*^__^*) !");
46                  try {
47                         Thread.sleep(500);
48                 } catch (InterruptedException e) {
49                     // TODO Auto-generated catch block
50                     e.printStackTrace();
51                 }
52                
53                 BrickNumber+=bricks;
54             }
55             System.out.println("哇咔咔,终于忙完了!");
56         }
57         else 
58         {
59               System.out.println("------又要开始砌砖了!呜 呜 呜 -------");
60              while(BrickNumber>0)
61              {
62                  System.out.println("距离完工还有: "+BrickNumber+" 块砖没搞完");
63                   BrickNumber-=bricks;
64              }
65              System.out.println("忙完咯! 可以去领工资啦! 欧耶.....!");
66         }
67     }    
68 }

效果图:

     你会发现,第一个同步线程和多线程的差异原来是,上面讲的等一个人全部做完,才轮到下一个人做。

——--------------------------------——参考文献——————————————————————————————————————————

                                                                     ******  《java 2 程序设计》 ----(第四版)

                                                                     ******  <<csdn网站>>

                                                                                                   ------------------作者 龚细军                                                                     

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码洞

《快学 Go 语言》第 3 课 —— 分支与循环

上面这个等式每一个初学编程的同学都从老师那里听说过。它并不是什么严格的数据公式,它只是对一般程序的简单认知。数据结构是内存数据关系的静态表示,算法是数据结构从一...

11030
来自专栏喵了个咪的博客空间

zephir-(6)运算符

#zephir-运算符# ? ##前言## 先在这里感谢各位zephir开源技术提供者 了解的动态变量和静态变量之后我们今天来了解一下在编码工作中至关重要的运算...

37090
来自专栏AhDung

C#遐想/瞎想

11920
来自专栏工科狗和生物喵

【我的漫漫跨考路】数据结构之队列的线性实现

正文之前 最近在家流年不利,先是昨天家里路由器还是ADSL调制解调器坏了。反正是没网了!然后,今天上午还停电了,昨晚因为熬夜写码,所以忘了给手机充电了。早上起来...

28680
来自专栏琯琯博客

设计模式详解

需要说明的一点是,文中的 UML 类图和规范的 UML 类图不大相同,其中组合关系使用以下箭头表示:

11530
来自专栏Java爬坑系列

【Java入门提高篇】Day16 Java异常处理(上)

  异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外的事情,它阻止了程序按照程序员的预期正常执行。

367120
来自专栏微信公众号:Java团长

Java经典设计模式之五大创建型模式(附实例和详解)

(1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

11210
来自专栏Java爬坑系列

【Java入门提高篇】Day1 抽象类

  基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分...

23260
来自专栏Web行业观察

typeof最新原理解析

我们都知道 typeof(null) === 'object',关于原因,在小黄书《你不知道的JavaScript》中有这么一段解释:

31910
来自专栏Java爬坑系列

【Java入门提高篇】Day16 Java异常处理(上)

16450

扫码关注云+社区

领取腾讯云代金券