黑马程序员技术交流社区

标题: 单例模式,线程同步 [打印本页]

作者: 周斌    时间: 2012-11-2 19:35
标题: 单例模式,线程同步
本帖最后由 周斌 于 2012-11-7 12:04 编辑

  单例模式为了创建对象唯一执行操作,线程同步也是执行操作只有一个对象,这两者有什么关系。

作者: 焦晨光    时间: 2012-11-2 19:43
本帖最后由 焦晨光 于 2012-11-2 19:44 编辑

单例模式是保证对象在内存中只能存在一个
属于数据共享

线程同步是保证同一个对象同时只能被一个线程访问
属于数据同步 亦属于数据共享

两者没有直接联系,有共同点:数据共享!~
作者: 周斌    时间: 2012-11-2 19:48
焦晨光 发表于 2012-11-2 19:43
单例模式是保证对象在内存中只能存在一个
属于数据共享

问一下,能否举些例子体现出单例模式用于数据共享,万分谢谢
作者: 焦晨光    时间: 2012-11-2 19:59
class Student
{
        private int age;
        private static Student s = new Student();
        private Student(){}
        public static Student getStudent()
        {
                return s;
        }
        public void setAge(int age)
        {
                this.age = age;
        }
        public int getAge()
        {
                return age;
        }
}

class SingleDemo
{
        public static void main(String[] args)
        {
               
                Student s1 = Student.getStudent();
                Student s2 = Student.getStudent();
                //上述两行代码指向的是同一个Student对象,这就是和new创建的对象最大的区别
                //总之,单例设计模式用在只操作一个对象的时候很方便
        }
作者: 焦晨光    时间: 2012-11-2 20:00
class Student
{
        private int age;
        private static Student s = new Student();
        private Student(){}
        public static Student getStudent()
        {
                return s;
        }
        public void setAge(int age)
        {
                this.age = age;
        }
        public int getAge()
        {
                return age;
        }
}

class SingleDemo
{
        public static void main(String[] args)
        {
               
                Student s1 = Student.getStudent();
                Student s2 = Student.getStudent();
                //上述两行代码指向的是同一个Student对象,这就是和new创建的对象最大的区别
                //总之,单例设计模式用在只操作一个对象的时候很方便
        }
作者: 奋斗的青春    时间: 2012-11-2 21:30
本帖最后由 吴愿涛 于 2012-11-2 21:33 编辑

1、线程同步允许一次只有一个线程访问共享资源。使用同步关键字synchronized来进行标识。同步可分为同步方法和同步块。
2、使用线程同步有可能造成死锁,为避免这种情况,java提供了线程间通信机制。实现线程之间通信的三个方法是wait(),notify()和notifyAll()。这三个方法是类Object中定义的方法,只能用于synchronized方法中。调用wait()方法,使线程进入等待池。调用notify()方法,唤醒等待池中第一个等待的线程。调用notifyAll()方法,唤醒多个在等待的线程。
3、单例模式也叫单态模式或Singleton模式。运行期间能且只能产生一个对象。如:
public class Singleton {
    private static Singleton instance = null;
    private Singleton() {
    }

    public static Singleton getInstance() {

       if (instance == null) {//这次判断将所有非第一次产生对象的线程排除

           synchronized (Singleton.class) {//都是第一次产生对象的线程在此排队

              if (instance == null) {//只允许第一个进入同步块的线程产生对象

                  instance = new Singleton();

              }

           }

       }

       return instance;
    }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2