发布网友 发布时间:2022-04-22 01:03
共1个回答
热心网友 时间:2023-09-16 22:52
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
Fine grain 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 don t use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here but don t use shared resources
}
}
lishixin/Article/program/Java/gj/201311/27267