有点激动,这是我第一次写技术型博客,当然这技术显得很浅显,只是想起一个总结的作用。以前我的总结都是在心里想,很少把想法写下来,今天决定开始写博客,每天进行总结。
我是一名大二的计算机专业的学生,十分喜爱自己的专业。大一到现在都在进行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);
}
@Override
public 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方法的话,两个方法就不能同时使用了,必须排队,因为一个对象在同一时间只能上一把锁。
以上就是我的总结。小弟自身水平有限,如果有错,请各位指出来,非常感谢。