线程部分方法、同步锁、单列模式

线程部分方法:

join();//等待该线程死亡
yield();表示该线程愿意产生一些当前使用的处理器
setPriority(1~10);优先级,默认的是5
Thread.currentThread()获得当前正在执行的线程对象
getName();获得名字
setName();修改名字
new Thread(任务,“名字”);
sleep(毫秒);睡眠

同步锁

多线程操作的时候可能会出现安全问题,因为当一个线程正在运算的过程中,另一个线程也参与了,这时就用到了同步锁。
同步锁: synchronized
synchronized(唯一 锁 共享对象){要锁的代码块}

private int count = 100;
while(count>0) {
	synchronized (Tick.class) {//this指的是当前对象,  共享对象
		if(count==0) {
			break;
		}
		try {
			Thread.sleep(100);
			} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"在卖,剩余"+--count);
		}
	}

Lock锁

	private Lock lock;
	private int cont = 100;
	public Ticket(Lock lock) {
	this.lock = lock;
	}
	while(true) {
		lock.lock();
		try {
			if(cont==0) {
				break;
			}
			Thread.sleep(100);
	System.out.println(Thread.currentThread().getName()+"正在卖:"+(--cont)+"张票");
			} catch (InterruptedException e) {
			e.printStackTrace();
			}finally {
			lock.unlock();
		}
}

synchronized和Lock锁的区别 :
1、synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁
2、用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。
如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了
3、synchronized放弃锁只有两种情况:①线程执行完了同步代码块的内容②发生异常;而lock不同,它可以设定超时时间,也就是说他可以在获取锁时便设定超时时间,如果在你设定的时间内它还没有获取到锁,那么它会放弃获取锁然后响应放弃操作

单列模式

单列模式:为了保证类对象的唯一(只能创建一个实例)
1、对象的构建通过构造器执行来创建
2、不能在其他类中随意创建对象
3、对象的创建在本类中提供一个公共方法

单列集合的创建方式: 懒汉模式存在的问题及处理:多线程调用时容易出现创建多个对象,可以添加锁来处理

  • 懒汉模式
class SingLe{
	private static SingLe single;
	
	private SingLe() {}
	public static SingLe getSingLe(){
		
		if(single ==null) {
			//加锁解决了两个线程同时调用,有延迟创建两个对象的问题,
			//但是带来了资源消耗的问题, 在外可以加个判断语句如果是空才执行加锁程序
			synchronized (SingLe.class) {
				if(single ==null) {
					//Thread.sleep(100);
					single = new SingLe();
				}
			}
		}
		return single;
	}
}

饿汉式:
工作中常用的是饿汉式

class SingLe2{
	private static SingLe2 single = new SingLe2();
	private SingLe2() {}
	public static SingLe2 getInstance() {
		return single;
	}
}
### 单模式的实现与解释 单模式是一种设计模式,用于确保某个类只有一个实存在,并提供全局访问点。以下是几种常见的单模式实现方式及其特点。 #### 饿汉式单 饿汉式单在类加载时就完成了实化操作,因此线程安全无需额外处理。这种方式简单高效,但在某些情况下可能会浪费资源,因为即使不使用该实也会提前创建[^5]。 ```java public class EagerInitializedSingleton { private static final EagerInitializedSingleton instance = new EagerInitializedSingleton(); private EagerInitializedSingleton() {} public static EagerInitializedSingleton getInstance() { return instance; } } ``` #### 懒汉式单 懒汉式单仅在第一次调用 `getInstance` 方法时才会创建实,从而延迟了实化的时机。然而,这种实现需要考虑多线程环境下的安全性问题[^2]。 ```java public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} public synchronized static LazyInitializedSingleton getInstance() { if (instance == null) { instance = new LazyInitializedSingleton(); } return instance; } } ``` 为了优化性能并减少锁的竞争,可以采用双重检查锁定机制(Double-Checked Locking),但这在 Java 5 之前可能由于内存模型缺陷而失败[^1]。 ```java public class DoubleCheckedLockingSingleton { private volatile static DoubleCheckedLockingSingleton instance; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; } } ``` #### 使用内部静态辅助类的单 Bill Pugh 提出了通过内部静态辅助类来实现单方法,这种方法既实现了延迟加载又避免了同步带来的开销[^1]。 ```java public class BillPughSingleton { private BillPughSingleton() {} private static class SingletonHelper { private static final BillPughSingleton INSTANCE = new BillPughSingleton(); } public static BillPughSingleton getInstance() { return SingletonHelper.INSTANCE; } } ``` #### 基于枚举类型的单 Java 枚举天然具备线程安全性和防止反序列化破坏单的能力,被认为是实现单的最佳实践之一[^3]。 ```java public enum EnumBasedSingleton { INSTANCE; public void performAction() { System.out.println("Enum-based singleton action"); } } ``` 以上每种方法都有各自的优缺点,开发者应根据实际需求选择合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值