线程同步
来源:互联网 发布:淘宝宝贝分类管理 编辑:程序博客网 时间:2024/05/20 10:13
研究了servlet是否线程安全后,又想起一个问题,就是如何考虑线程同步?
资料上说:线程安全问题都是由全局变量及静态变量引起的。而如果每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
那么在java中,如何考虑线程同步呢?
java里一般有2种方法进行同步:同步方法和同步语句块。
synchronized用于设置同步,它所定的是调用这个同步方法对象,也就是同一个对象在不同线程中执行这个方法时,他们是互斥的,但是这个方法所属的其他对象可以任意调用这个方法。
下面给出一些参考:
1。同步方法
Public synchronized void methodAAA()
{
//….
}
它等同于下面:
public void methodAAA()
{
synchronized (this) // this是调用这个方法的对象
{
//…..
}
}
2。同步语句块
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
锁就是so这个对象,当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance变量
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
3.将synchronized作用于static 函数,示例代码如下:
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函数
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(类名称字面常量)
}
}
代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。
资料上说:线程安全问题都是由全局变量及静态变量引起的。而如果每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
那么在java中,如何考虑线程同步呢?
java里一般有2种方法进行同步:同步方法和同步语句块。
synchronized用于设置同步,它所定的是调用这个同步方法对象,也就是同一个对象在不同线程中执行这个方法时,他们是互斥的,但是这个方法所属的其他对象可以任意调用这个方法。
下面给出一些参考:
1。同步方法
Public synchronized void methodAAA()
{
//….
}
它等同于下面:
public void methodAAA()
{
synchronized (this) // this是调用这个方法的对象
{
//…..
}
}
2。同步语句块
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
锁就是so这个对象,当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance变量
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
3.将synchronized作用于static 函数,示例代码如下:
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函数
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(类名称字面常量)
}
}
代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。
0 0
- 线程同步--线程同步--线程同步--线程同步--线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 验证花括号是否正确出现的c程序源代码
- MFC学习笔记——未分类
- 安卓蓝牙API(2)
- C++ 派生类Derived Classes
- Embedded C language screen operation menu
- 线程同步
- MySQL与php的连接操作要点
- Mongodb shell 常用操作
- 手游云测试工具TestBird登陆韩国
- C语言中变量的存储类型与初始化
- 继承
- Chrome development tools学习笔记(1)
- java.security.MessageDigest的使用
- ubuntu下安装程序的三种方法