synchronized同步方法的总结:
{
//中间包住操作共享数据的代码
}
1.同步方法仍然涉及到同步监视器,只是我们不需要显式的声明
2.非静态的同步方法,同步监视器是:this(就是当前对象)
3.静态的同步方法,同步监视器是当前类本身(就是类————也可以看成类是一个对象)
sleep() wait()区别:
sleep() 在Thread类(比较广泛)但不会主动的释放锁
wait()只能在同步代码块 或者同步方法中,要配合使用需要notify()去激活其他线程,执行完会自动释放锁
4.写一个线程安全的饿汉式(饿汉式天生就是线程安全的)
饿汉式是指在类加载时就完成了实例化,因此不存在线程安全问题。以下是一个线程安全的饿汉式实现示例:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
在该实现中,我们将 Singleton 类的构造方法设为私有,使得在类外无法创建新的实例。同时,我们在类中创建了一个私有的静态成员变量 instance,用于存储唯一的实例,并在类加载时就进行初始化。由于 instance 的初始化是在类加载时进行的(static 关键字的作用),因此不存在线程安全问题。同时,我们提供了一个静态的公有方法 getInstance(),用于获取 Singleton 类的唯一实例。由于该实现中只存在一个实例,因此不需要进行线程同步。(因此存在唯一实例天生线程安全)
5.写一个线程安全的懒汉式
public class Singleton {
// 声明一个私有的 Singleton 对象 instance,但不初始化它
private static Singleton instance;
// 声明一个私有的构造函数,防止其他类实例化 Singleton 类
private Singleton() {}
// 声明一个公有的静态方法,返回 Singleton 实例
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在 getInstance() 方法中,我们使用了 synchronized 关键字来确保线程安全。这样一来,当前线程获取实例时,其他线程就无法进行实例化操作,从而保证了线程安全。但这种方式并不高效,因为每次获取实例都需要等待同步锁。因此,我们可以考虑使用双重检查锁定的方式来提高效率。
步骤:首先---公共类---私有构造器----私有全局变量(饿汉式直接new对象,懒汉式等着new对象)--公有静态方法(饿汉式直接return 对象instance。 )懒汉式首先 在公有静态方法中加一个同步监视器--防止多个线程进入造成线程安全问题--然后需要判断对象地址是否为空指针,再new对象 然后return insatnce;
6.单例模式的好处
单例模式是一种常用的设计模式,在软件开发中可用于实现一些具有全局唯一性的对象或资源,具有以下好处:
-
节省资源:单例模式只创建一个实例,避免了重复创建和销毁对象的开销,减少了系统资源的消耗。
-
简化调用:由于单例模式只有一个实例,因此减少了不必要的对象创建和对象销毁操作,简化了对象调用的复杂度。
-
维护一致性:单例模式的全局唯一性可以保证对象状态的一致性,避免了多个对象对同一资源进行修改而引发的冲突问题。
-
提高效率:单例模式可以避免因为创建对象和销毁对象而导致的系统性能下降,同时也可以优化对象的访问速度,提高系统的运行效率。
-
实现容易:单例模式是一种经典的设计模式,实现简单,易于理解和维护,可以提高代码的可读性、可维护性和可扩展性。
java中穿件多线程的方式有4种:
继承Thread类
实现Runnable接口
实现Callable接口
线程池(响应速度提高,提高资源的重复利用率,便于管理)