Java如何处理多线程的数据同步问题
来源:互联网 发布:淘宝买东西在哪里备注 编辑:程序博客网 时间:2024/06/04 19:02
Java中有如下的方法来处理代码块的并发访问问题:
一是关键字synchronized
二是加锁(锁对象,条件对象)
Java给每一个对象都提供了一个内部锁,在方法的定义中加上关键字synchronized后,那么对象的锁将保护整个方法。也就是说下面两种写法是等价的:
public synchronized void method()
{
......
}
public void method()
{
this.intrinsickLock.lock();
try
{
......
}
finally
{
this.intrinsickLock.unlock;
}
}
Java Core中对以上两种方式都不推荐!
关键词synchronized解读:
synchronized实现原理就是Java为每一个对象都内置了一个锁。对于一个类的普通方法来说,synchronized锁住的是每一个new出来的对象的方法,比如说对于如下代码:
public class Test{
public void synchronized testMethod()
{
.......
}
}
Test obj1 = new Test();
Test obj2 = new Test();
如果Thread-1 访问的是obj1,Thread-2访问的是obj2,那么两个线程都不会阻塞,因为这是两个不同的对象。
如果Thread-1 访问的是obj1,Thread-2访问的也是obj1,那么Thread-2会阻塞,因为两个线程访问的是同一个的对象,但是Thread-1先获取了锁,所以Thread-2必须等到Thread-1释放了锁,才能访问。
对于一个静态方法而言,synchronized则成为了一个类锁,对于上面所描述的场景,两种情况下,Thread-2都会被阻塞,因为静态方法是类的所有对象都共享的。
synchronized除了能锁整个方法之外,也能锁代码块。
一种写法是:
public void method()
{
synchronized(this)
{
....
}
.....
}
另外一种写法是:
Object obj = new Object();
public void method()
{
synchronized(obj)
{
....
}
.....
}
第二种写法更加灵活一些。在用synchronized的时候,需要当心的是过度使用synchronized来进行保护,造成性能的问题。
一是关键字synchronized
二是加锁(锁对象,条件对象)
Java给每一个对象都提供了一个内部锁,在方法的定义中加上关键字synchronized后,那么对象的锁将保护整个方法。也就是说下面两种写法是等价的:
public synchronized void method()
{
......
}
public void method()
{
this.intrinsickLock.lock();
try
{
......
}
finally
{
this.intrinsickLock.unlock;
}
}
Java Core中对以上两种方式都不推荐!
关键词synchronized解读:
synchronized实现原理就是Java为每一个对象都内置了一个锁。对于一个类的普通方法来说,synchronized锁住的是每一个new出来的对象的方法,比如说对于如下代码:
public class Test{
public void synchronized testMethod()
{
.......
}
}
Test obj1 = new Test();
Test obj2 = new Test();
如果Thread-1 访问的是obj1,Thread-2访问的是obj2,那么两个线程都不会阻塞,因为这是两个不同的对象。
如果Thread-1 访问的是obj1,Thread-2访问的也是obj1,那么Thread-2会阻塞,因为两个线程访问的是同一个的对象,但是Thread-1先获取了锁,所以Thread-2必须等到Thread-1释放了锁,才能访问。
对于一个静态方法而言,synchronized则成为了一个类锁,对于上面所描述的场景,两种情况下,Thread-2都会被阻塞,因为静态方法是类的所有对象都共享的。
synchronized除了能锁整个方法之外,也能锁代码块。
一种写法是:
public void method()
{
synchronized(this)
{
....
}
.....
}
另外一种写法是:
Object obj = new Object();
public void method()
{
synchronized(obj)
{
....
}
.....
}
第二种写法更加灵活一些。在用synchronized的时候,需要当心的是过度使用synchronized来进行保护,造成性能的问题。
0 0
- Java如何处理多线程的数据同步问题
- java多线程的同步问题
- Java多线程的同步问题
- Java多线程(数据同步)
- java多线程数据同步
- 为多线程处理同步数据
- java多线程同步问题
- 浅谈Java多线程的同步问题
- 浅谈Java多线程的同步问题
- 浅谈Java多线程的同步问题
- Java多线程同步问题的探究
- 浅谈Java多线程的同步问题
- 浅谈Java多线程的同步问题
- 浅谈Java多线程的同步问题
- 浅谈Java多线程的同步问题
- 【转】浅谈Java多线程的同步问题
- 浅谈Java多线程的同步问题
- 浅谈Java多线程的同步问题
- 支持向量机SVM(一):支持向量机SVM的推倒:从logistic回归,到函数间隔,集合间隔,到寻找最优间隔分类器。
- sap workflow and BPM
- [Leetcode] Subsets
- Android 使用 ANT 打包 Android 应用 .
- JavaScript之 ------ 基本运用语法(变量、运算符、语句)
- Java如何处理多线程的数据同步问题
- 异步JavaScript的进化
- java
- git基础
- usort php shell
- JVM
- 利用NSOperation进行异步图片下载——设置UITabView数据,图片下载,占位图。解决异步下载和Cell重用造成的图片设置混乱。和多次重复下载的问题
- (新手)请问怎么实现单击BUTTON后使原来textview的内容发生改变
- Java接口使用问题