多线程学习-常用知识点(守护线程、线程状态、join、synchronized、lock)
程序员文章站
2022-03-05 12:13:41
...
守护线程和非守护线程
守护线程和主线程共存亡。最典型的守护线程是GC线程。
线程的七种状态
准备、就绪、运行、阻塞、(等待、超时等待)、结束
join方法
join作用是让其他线程进入等待状态,实现多线程同步操作。
线程安全问题
多个线程同时共享同一个全局变量或静态变量,做写的操作的时候会出现数据冲突问题。
synchronized和lock
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性
同步函数使用的this锁。
package com.harvey.demo;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 并发包有返回值 实现线程
*/
public class ThreadDemo1 implements Runnable{
private int count=100;//共享资源
private Object object=new Object();
public Lock lock = new ReentrantLock();
public void run() {
while (count>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
sale1();
}
}
//使用同步代码块
public void sale(){
synchronized (object) {
if(count>0){
System.out.println(Thread.currentThread().getName() + "-出售第" + (100 - count + 1) + "张票");
count--;
}
}
}
//使用synchronized方法
public synchronized void sale1(){
if(count>0){
System.out.println(Thread.currentThread().getName() + "-出售第" + (100 - count + 1) + "张票");
count--;
}
}
//使用this锁
public void sale2(){
synchronized (this) {
if (count > 0) {
System.out.println(Thread.currentThread().getName() + "-出售第" + (100 - count + 1) + "张票");
count--;
}
}
}
//使用Lock锁
public void sale3(){
lock.lock();
if(count>0){
System.out.println(Thread.currentThread().getName() + "-出售第" + (100 - count + 1) + "张票");
count--;
}
lock.unlock();
}
//使用synchronized方法 共享变量必须是静态变量
public static synchronized void sale4(){
if(count>0){
System.out.println(Thread.currentThread().getName() + "-出售第" + (100 - count + 1) + "张票");
count--;
}
}
}
class Demo{
public static void main(String[] args) {
ThreadDemo1 thread = new ThreadDemo1();
Thread t1 = new Thread(thread,"线程1");
Thread t2 = new Thread(thread,"线程2");
t1.start();
t2.start();
}
}