java数据同步处理_Java如何处理多线程的数据同步问题

在这里写这种文章好奇怪,先用作笔记吧

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来进行保护,造成性能的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值