Java多线程锁是为了解决数据同步中的数据安全问题下面我们就来详细的学习下有关于Java多线程锁的相关问题只有不断的学习才能不断的提高自身的相关技术
大多数应用程序要求线程互相通信来同步它们的动作在Java程序中最简单实现同步的方法就是上Java多线程锁为了防止同时访问共享资源线程在使用资源的前后可以给该资源上锁和开锁假想给复印机上锁任一时刻只有一个职员拥有钥匙若没有钥匙就不能使用复印机
给共享变量上Java多线程锁就使得Java线程能够快速方便地通信和同步某个线程若给一个对象上了锁就可以知道没有其他线程能够访问该对象即使在抢占式模型中其他线程也不能够访问此对象直到上锁的线程被唤醒完成工作并开锁那些试图访问一个上锁对象的线程通常会进入睡眠状态直到上锁的线程开锁一旦锁被打开这些睡眠进程就会被唤醒并移到准备就绪队列中
在Java编程中所有的对象都有锁线程可以使用synchronized关键字来获得锁在任一时刻对于给定的类的实例方法或同步的代码块只能被一个线程执行这是因为代码在执行之前要求获得对象的Java多线程锁继续我们关于复印机的比喻为了避免复印沖突我们可以简单地对复印资源实行同步如同下列的代码例子任一时刻只允许一位职员使用复印资源通过使用方法(在 Copier 对象中)来修改复印机状态这个方法就是同步方法只有一个线程能够执行一个Copier对象中同步代码因此那些需要使用Copier对象的职员就必须排队等候
class CopyMachine {
public synchronized void makeCopies(Document d int nCopies) {
//only one thread executes this at a time
}
public void loadPaper() {
//multiple threads could access this at once!
synchronized(this) {
//only one thread accesses this at a time
//feel free to use shared resources overwrite members etc
Finegrain Java多线程锁
在对象级使用锁通常是一种比较粗糙的方法为什么要将整个对象都上锁而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源就不需要只为了让一个线程使用其中一部分资源就将所有线程都锁在外面由于每个对象都有Java多线程锁可以如下所示使用虚拟对象来上锁
class FineGrainLock {
MyMemberClass x y;
Object xlock = new Object() ylock = new Object();
public void foo() {
synchronized(xlock) {
//access x here
}
//do something here but dont use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here but dont use shared resources
}
}
若为了在方法级上同步不能将整个方法声明为synchronized关键字它们使用的是成员Java多线程锁而不是synchronized方法能够获得的对象级锁