初学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方法的话,两个方法就不能同时使用了,必须排队,因为一个对象在同一时间只能上一把锁。
以上就是我的总结。小弟自身水平有限,如果有错,请各位指出来,非常感谢。
- 初学java线程同步容易出错的地方(我的第一篇博客)
- 我的第一篇java初学代码
- java的一些容易出错的地方!
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- Java向前引用容易出错的地方
- delete容易出错的地方
- php容易出错的地方
- C++ 容易出错的地方
- UINavigationController容易出错的地方
- 我的第一篇博客
- 我的博客 第一篇
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- 我的第一篇博客
- Mongodb 8宗罪
- BO报表制作中需求进行报表之间的链接写法
- 什么是索引?索引有哪几种?什么时候用索引比较好?
- 对子页面自动关闭后,自动刷新父页面的修改后的数据 的做法
- Linux 下扩充根分区分区的大小
- 初学java线程同步容易出错的地方(我的第一篇博客)
- 俄120岁老人坐牢103年:出狱后最想饮美酒讨媳妇
- android调用系统相机实现拍照功能
- 【转】HttpClient 教程 (一)
- 多线程中递归锁的实现
- Ext.onReady()事件
- Eclipse兩問題--mark
- 线程
- 揭开PC-Lint9的神秘面纱