-
为什么要有线程锁?
多个线程之间会争夺资源,所以有或许一个线程实施到一半,就被另一个线程争夺了资源,这样就会构成线程的不安全,为了保证线程的安全性,安全咱们能够运用线多线程并发程锁来处理这个问题线程池面试题。
比如下面的比如,正常应该打印出两线程池句“今日你学习了吗?”,但是有安全工程专业或许thread1刚实施到一半,th线程池的七个参数read2就争夺了资源,所以就会导致实施次序紊乱:
public class Thread线程池的七个参数Demo {
public static void main(String[] args) throws InterruptedException {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread(线程安全);
myThread1.start();
myThread2.start();
}
static class MyThread extends Thread {
@Override
public void run() {
for (char c : "今日你学习了吗?".toCharArray()多线程并发) {
System.o线程池的七个参数ut.print(c);
}
}
}
}
实施效果: 今日你学习今日你学了吗?习了吗? //次序紊乱❌
-
怎样处理线程不安全?
上面的比如会导致线程不安全,咱们能够运用synchro多线程和多进程的差异nized来处理:
pub安全工程lic class Thread多线程并发Demo {
public stati多线程cpu有什么好处c void main(Stri安全工程ng[] args) throws InterruptedException {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();安全期计算器
myThread2.start();
}
static class MyThread extends Thread {
@Override
public void run() {
/多线程的完成办法/这儿加锁✅
synchronized (Thr多线程下载eadDemo.class){
for (char c : "今日你学习了吗?".toCharArray()) {
System.out.print(c);
}
}
}
}
}
实施效果: 今日你学习了吗?今日你学习了吗? //次序正确✅
-
Sync多线程的完成办法hronized详解
上面代码咱们只需求加上synchronized就能够处理线程的几种状态线程安全问题,synchronized也被咱们成为“同步锁”,synchronized是一个关键字,能够修饰在成员办法也能够单独写成同步代码块,被synchronized修饰的代码块中,同一时间最多只能有一个线程实施代码块中安全工程的代码。
从上面图中能够看到安全出产月,为了防止多个线程一同修正代码影响代码的安全性,咱们用锁将一部分代码锁了起来,多个线程之间要争夺锁,一同只有一个线程能够拿到锁取得实施权限,其他线程只能在外面等着这个线程开释锁,然后再次争夺锁取得实施权限。这样就能够处理线程不安全的问题。线程和进程的差异是什么
-
政策锁
办法一
private synchronized void count(){
...
}
办法二
private void线程的概念 count(){
syn多线程chronized (this){
...
}
}
办法三
priv线程撕裂者ate Object mObject = new Object();
priva安全出产月te void count(){
synchronized (mObject){
...
}
}
-
类锁
办法一
private synchronized sta安全出产法tic void count(){
...
}
办法二
private st线程撕裂者atic vo多线程cpu有什么好处id count(){
synchronized (T安全教育平台登录入口hreadDemo.class){
...
}
}
办法三
private st多线程的完成办法atic Object mObject = new Object();
private vo多线程面试题id count(){
synchronized (mObject){
...
}
}
-
总结
政策锁:
政策线程的几种状态锁锁的是政策的实例,多线程运用的时分需求保证是同一个实例,不然加锁将没有意义。
类锁:
类锁锁的是类的仅有class政策,静态办法加synchronized默许就是类锁。
留意:
类锁和政策锁能够一同运用,互不搅多线程下载扰。
-
wait()和notify()、notifyAll()
wait():
当线程实施wait()办法时分,会开释当前的锁,然后让出CPU,进入等候情况,直到被notify()/notifyAll()唤醒。
notify():
唤醒一个处于wait情况的线程。
no多线程的并发问题tifyAll():
唤醒全部线程是什么意思处于wait情况的线程。
-
两个线程替换打印0~100
运用wait()和notify()以及synchronized安全能够很轻松完成这个功用:
public class ThreadDemo {
private static int n安全um;
private stat线程的几种状态ic Object sObject安全教育 = n安全工程专业ew Object();
public static void main(String[] args) {
new Thread(new MyRunnable(),"线程1").start();
new Thread(new MyRunnable(),"线程2").start();
}
static class MyRunnable implements Runnable {
@Override多线程是什么意思
public void run() {
while (true) {
synchronized (sObject){
System.out.println(Thread.currentThread().getName() + ": "+ num++);
sObject.notify();
if (num>=100) return;
try {
sObject.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
打印:
线程1: 0
线程2: 1
线线程撕裂者程1: 2
...
线程2: 99
线程1: 100