线程同步&线程池
线程同步
线程不同步会出现的问题:
线程同步:
线程同步实现的3种方式:
同步代码块
synchornized(obj){
//涉及操作同一资源的代码
}
注: 没有静态的同步代码块
obj: 任意类型的对象,相当于一把锁,操作同一资源的而线程必须使用同一把锁。
如何保证多个线程使用同一把锁?
在设置线程任务,即定义线程对象时在成员变量的位置上声明一个对象,将声明的变量放在sychornized代码块中
/**
模拟买票功能,开启多个线程,同时买一百张票
/
public class SaleTicket implements Runnable{
/
不同对象使用同一个变量
/
private static int ticket=100 ;
/**
*不同线程使用同一个锁对象
*/
private Object obj = new Object();
@Override
public void run() {
while(true) {
/**
* 使用synchornized(obj) {} 代码块
*/
synchronized (obj) {
if (ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "sale=====" + ticket);
ticket--;
}
}
}
}
}
public class SaleTicketDemoTest {
public static void main(String[] args) {
SaleTicket sale = new SaleTicket();
//开启3个线程操作同一对象,从而操作同一资源
Thread th1 = new Thread(sale);
Thread th2 = new Thread(sale);
Thread th3 = new Thread(sale);
th1.start();
th2.start();
th3.start();
}
}
同步方法
public synchornied void 方法名(){
//涉及操作同一资源的方法
}
同步方法的锁:
同步方法的锁使用的是this对象,即new Thread(Xxx) 的Xxx对象
package com.test.java;
/**
*模拟买票功能,开启多个线程,同时买一百张票
*/
public class SaleTicket implements Runnable{
/*
不同对象使用同一个变量
*/
private static int ticket=100 ;
/**
*不同线程使用同一个锁对象
*/
private Object obj = new Object();
@Override
public void run() {
while(true) {
saleTicket();
}
}
/**
* 定义个个同步方法 public snychonized void XXX(){}
*/
public synchronized void saleTicket() {
if (ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "sale=====" + ticket);
ticket--;
}
}
}
静态的同步方法
public static sychornized xxx(){
//涉及操作共同资源的代码
}
静态同步方法的锁是类名.class对象
package com.test.java;
/**
*模拟买票功能,开启多个线程,同时买一百张票
*/
public class SaleTicket implements Runnable{
/*
不同对象使用同一个变量
*/
private static int ticket=100 ;
/**
*不同线程使用同一个锁对象
*/
private Object obj = new Object();
@Override
public void run() {
while(true) {
saleTicket();
}
/**
* 静态同步方法
*/
public static synchronized void saleTicket() {
if (ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "sale=====" + ticket);
ticket--;
}
}
}
锁机制
Jdk1.5后在java.util.concurrent.locks
线程池
原文:https://www.cnblogs.com/Auge/p/11609901.html