public class NoLock {
/*
这里声明了一个名字为lock的对象锁。我们在ThreadA和ThreadB内需要同步的代码块里,都是用synchronized关键字加上了同一个对象锁lock。
|||匚匚坷隿§狳凢âîîêí´©©²«ªÛ«³Þ²ÜÝßÜ«¯²«®¯°²¬Ü®«ßÛ²ÞàÝ«à®®ÛÝ|||
上文我们说到了,根据线程和锁的关系,同一时间只有一个线程持有一个锁,那么线程B就会等线程A执行完成后释放lock,线程B才能获得锁lock。
这里在主线程里使用sleep方法睡眠了10毫秒,是为了防止线程B先得到锁。因为如果同时start,线程A和线程B都是出于就绪状态,操作系统可能会先iknow-pic.cdn.bcebos.com/让B运行。这样就会先输出B的内容,然后B执行完成之后自动释放锁,线程A再执行。
*/
static class ThreadA implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread A " + i);
}
}
}
static class ThreadB implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread B " + i);
}
}
}
public static void main(String[] args) {
new Thread(new ThreadA()).start();
new Thread(new ThreadB()).start();
}
}
/*
线程之间,有一个同步的概念。在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生。
所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了,直到解锁后才可以访问。
*/
public class ObjLock {
private static Object lock = new Object();
static class ThreadA implements Runnable {
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i < 100; i++) {
System.out.println("Thread A " + i);
}
}
}
}
static class ThreadB implements Runnable {
@Override
public void run() {
synchronized (lock) {
for (int i = 0; i < 100; i++) {
System.out.println("Thread B " + i);
}
}
}
}
mI电梯-lock的对象锁
最新推荐文章于 2024-08-14 21:00:35 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)