一、为什么需要线程同步?
答:线程的同步可以解决多线程中容易出现的线程安全问题。
二、线程同步的方式有哪些?
其实线程的同步方法有很多,这里只介绍三种较为简单的、易理解的方式。
- 同步方法
- 同步代码块
- 锁机制的简单实现
2.1同步方法
1.同步方法的基本语法结构:
synchronized(同步监听对象){
可能引发线程安全问题的代码
}
注:此处的代码是伪代码
2.同步方法的语法特点
(a)同步监听对象可以是任意的对象
(b) 需保证所有的线程共享同一个同步监听对象
2.2同步代码块
1.同步代码块的基本语法结构:
(也可在此处添加synchronized)修饰符 synchronized 返回值类型 方法名(){
可能引发线程安全问题的代码
}
注:此处也是伪代码
2.同步代码块的语法特点:
(a)synchronized的位置在修饰符前,或者在修饰符后都可以
(b)同步代码块中不需要也不能够显示的写出同步监听对象
(c) 如果此方法是一个非 static 的方法,那么同步监听对象就是this
(d) 如果此方法是 static 的方法,那么同步监听对象就是当前方法所在的类的字节码对象
2.3锁机制的简单实现线程同步
锁机制是在java.util包下提供了一个接口Lock,锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。
这里需要了解一下 ReentrantLock 类,这个类是 java.util.concurrent.locks 的一个类。
在API中的解释为:一个可重入的互斥锁 Lock
,它具有与使用 synchronized
方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。详细的可以在API中查看。
锁机制的基本语法:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // 获取锁
try {
// ... method body
} finally {
lock.unlock(); //释放锁
}
}
}
注:如果线程是继承Thread方式,那么创建的锁必须声明成为static关键字,不然对应的锁就不是同一个对象。
最后:因为自已学习Java的时间尚短,理解也不够深入,只是想让自己学会总结,并可以给Java初学者和小白提供一些思路与想法。互帮互助,多总结,多思考,学习任何一门语言都需要长时间的练习与不断地思考(超级无敌天才除外),望君与我可共同进步。
如果大家在文档中发现了错误或者有问题,欢迎私聊。
还有:实现线程同步还有其他的一些方法:
eg:1.使用特殊域变量(volatile)实现线程同步
2.使用重入锁实现线程同步
3.使用局部变量实现线程同步
4.使用阻塞队列实现线程同步
5.使用原子变量实现线程同步
这些方法我也只是了解,所以大家如果感兴趣可以自己查找资料学习。
好久没写博客了,第一次写是八月十五号,现在是九月二十五号,刚想写博客的时候就是想要借写博客来使自己的思路以及对这方面的研究可以更加的投入,可是还是败给了自己的懒惰。今天回来,写点自己的想法。加油!!you and me !! come!