5个步骤,教你瞬间明白线程和线程安全
5个步骤,教你瞬间明白线程和线程安全
public void threadMethod(int j) {
int i = 1;
j = j + i;
}
public class ThreadDemo {
int count = 0; // 记录方法的命中次数
public void threadMethod(int j) {
count++ ;
int i = 1;
j = j + i;
}
}
public class ThreadDemo {
int count = 0; // 记录方法的命中次数
public synchronized void threadMethod(int j) {
count++ ;
int i = 1;
j = j + i;
}
}
private Lock lock = new ReentrantLock(); // ReentrantLock是Lock的子类
private void method(Thread thread){
lock.lock(); // 获取锁对象
try {
System.out.println("线程名:"+thread.getName() + "获得了锁");
// Thread.sleep(2000);
}catch(Exception e){
e.printStackTrace();
} finally {
System.out.println("线程名:"+thread.getName() + "释放了锁");
lock.unlock(); // 释放锁对象
}
}
public static void main(String[] args) {
LockTest lockTest = new LockTest();
// 线程1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// Thread.currentThread() 返回当前线程的引用
lockTest.method(Thread.currentThread());
}
}, "t1");
// 线程2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
lockTest.method(Thread.currentThread());
}
}, "t2");
t1.start();
t2.start();
}
private void method(Thread thread){
// lock.lock(); // 获取锁对象
if (lock.tryLock()) {
try {
System.out.println("线程名:"+thread.getName() + "获得了锁");
// Thread.sleep(2000);
}catch(Exception e){
e.printStackTrace();
} finally {
System.out.println("线程名:"+thread.getName() + "释放了锁");
lock.unlock(); // 释放锁对象
}
}
}
private void method(Thread thread) throws InterruptedException {
// lock.lock(); // 获取锁对象
// 如果2秒内获取不到锁对象,那就不再等待
if (lock.tryLock(2,TimeUnit.SECONDS)) {
try {
System.out.println("线程名:"+thread.getName() + "获得了锁");
// 这里睡眠3秒
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
} finally {
System.out.println("线程名:"+thread.getName() + "释放了锁");
lock.unlock(); // 释放锁对象
}
}
}
private void method(Thread thread) throws InterruptedException {
// lock.lock(); // 获取锁对象
// 如果5秒内获取不到锁对象,那就不再等待
if (lock.tryLock(5,TimeUnit.SECONDS)) {
try {
System.out.println("线程名:"+thread.getName() + "获得了锁");
}catch(Exception e){
e.printStackTrace();
} finally {
System.out.println("线程名:"+thread.getName() + "释放了锁");
lock.unlock(); // 释放锁对象
}
}
}
“ 征稿啦 ”
来源https://csdnnews.blog.csdn.net/article/details/82321777?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-19.vipsorttest&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-19.vipsorttest