初学java线程同步容易出错的地方(我的第一篇博客)

来源:互联网 发布:ubuntu和debian centos 编辑:程序博客网 时间:2024/06/05 23:04

        有点激动,这是我第一次写技术型博客,当然这技术显得很浅显,只是想起一个总结的作用。以前我的总结都是在心里想,很少把想法写下来,今天决定开始写博客,每天进行总结。

       我是一名大二的计算机专业的学生,十分喜爱自己的专业。大一到现在都在进行C语言实现数据结构和算法的学习,最近感觉遇到了瓶颈,感觉很难提高。所以就打算学习一些工程性的东西来激发一下灵感,正好也加入了学校的一个工作室,和一些学长做一些小东西,当然这期间不会放松基础的学习,每天的算法练习是不会落下的。由于自己的编程基础较好,学东西还算比较快。

       不说闲话了,回到正题。线程是一个非常重要的计算机概念,而线程同步对于初学者来说很容易出错,所以我就想这总结一下,对自己也对其他需要的人有点提示的作用。

       先放上我写的一段小程序:

    

public class MyTest1 implements Runnable {public static int num = 1;public static void main(String[] args) {MyTest1 r1 = new MyTest1();Thread t1 = new Thread(r1);t1.start();//t1线程启动,在t1线程中调用function1()方法r1.function2();//这样调用function2()是主线程在调用//System.out.println(num);}@Overridepublic void run() {function1();}public synchronized void function1() {num ++;try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("num is "+num);}public  void function2() {num ++;try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("function2() " + num);}}

       我觉得有几个值得注意也很容易出错的地方:

     1.r1对象以参数的形式传递给t1,但是单独的r1.function2()不是在r1线程中启动的,而是在主线程中启动的,这一点可以从程序运行结果function2() 3
    num is 3   可以看出来。但是以实现接口的方式来实现线程的方法,调用线程的所有方法都是"Thread.  "的格式,很容易让人误解成这个Thread始终是当前对象Thread。

    2.当t1启动的时候,也就是调用了run(),从而调用function1()使t1被锁定,但是这里的锁定只是指t1对象的function1()方法在锁定期间不能被使用了,其他的非synchronized方法都是可以使用的。但如果还有其他synchronized方法的话,两个方法就不能同时使用了,必须排队,因为一个对象在同一时间只能上一把锁。

   

     以上就是我的总结。小弟自身水平有限,如果有错,请各位指出来,非常感谢。