Thread-线程的同步
2021-05-01 07:29
标签:返回 size 效率 dem vat 机制 bool 问题 方法 普通的同步方法,锁对象是this 静态的同步方法,锁对象是:当前类.class 扩展: synchronized("abc"){} //可以实现线程同步,因为abc在字符串常量池中,但即使没有共享的对象也会需要排队等待 Object obj = new Object(); //可以定一个全局属性,实现有共享对象obj synchronized(obj){} 底层已经实现了线程同步 以下是不安全的线程 可以使用并发容器解决以上线程不安全问题 就会出现以下情况,线程无法执行下去,一直在等待 更改run方法中的锁机制 不要在同一个代码块中,同时持有多个对象的锁 Thread-线程的同步 标签:返回 size 效率 dem vat 机制 bool 问题 方法 原文地址:https://www.cnblogs.com/xiaokw/p/MrXiaoK.html线程的同步实现方式
方式一:同步代码块
synchronized(锁对象){
//需要上锁的内容(同步代码块)
}
方式二:同步方法
public synchronized 返回类型 方法名(参数){
//需要上锁的内容(同步代码块)
}
要求
案例:解决单例模式中懒汉式多线程问题
public class Singletion_Demo3 {
public static void main(String[] args) {
A a = new A();
A b = new A();
a.start();
b.start();
}
}
class A extends Thread{
public void run() {
for(int i=0;i
并发容器
CopyOnWriteArrayList
import java.util.ArrayList;
import java.util.List;
public class Thread_Demo1 {
public static void main(String[] args) throws InterruptedException{
List
import java.util.concurrent.CopyOnWriteArrayList;
public class Thread_Demo2 {
public static void main(String[] args) throws InterruptedException{
CopyOnWriteArrayList
线程死锁
产生
public class DeathLock {
public static void main(String[] args) {
new DeathMethod(true,"小红").start();
new DeathMethod(false,"小明").start();
}
}
class EatApple{
public void eat() {
System.out.println(Thread.currentThread().getName()+"吃苹果");
}
}
class EatBanana{
public void eat() {
System.out.println(Thread.currentThread().getName()+"吃香蕉");
}
}
class DeathMethod extends Thread{
private static EatApple apple = new EatApple();
private static EatBanana banana = new EatBanana(); ;
boolean flag;
public DeathMethod(boolean flag,String name) {
super(name);
this.flag = flag;
}
public void run() {
if(flag) {
synchronized(apple) {
apple.eat();
synchronized(banana) {
banana.eat();
}
}
}else {
synchronized(banana) {
banana.eat();
synchronized(apple) {
apple.eat();
}
}
}
}
}
小红吃苹果
小明吃香蕉
解决
public void run() {
if(flag) {
synchronized(apple) {
apple.eat();
}
synchronized(banana) {
banana.eat();
}
}else {
synchronized(banana) {
banana.eat();
}
synchronized(apple) {
apple.eat();
}
}
}
下一篇:动态规划算法