编写需要学习编程语言,例如c语言,java等。
1、有基础的学员:对于没有任何编程基础的初学者槐枣迅来说,要想快速入门编程,最为有效的方式之一就是与专业人士进行交流,在专业人士的指导下进行学习会有比较高的学习效率,而且也会有一个系统的学习过程,当前可以充分利用互联网来开辟自己的交流渠道。
2、无基础的学员:对于已经有一定编程基础的同学来说,边用边学往往会有更高的学习效率,比如程序员在学习一门新的编程语言时,如果采用听课的方式学习也许并不是最高效的。
很多程序员是直接看代码案例,然后就开始尝试应用,然后再逐渐提升应用的熟练程度,铅此因为对于已经有成熟编程思想的程序员来说,不同的编程语言仅仅是语法上的不同,思想终归是统一的。
编程语言难易
编程语言的语法并不难掌握,但是要想熟练运用编程语言,一定要多做实验,这个过程是无法忽略的,也没有任何捷径,编程语言用得多了,自然也就熟练了。对于很多应用级程序员来说,编程并没有太多需要思考的地方,也不需要设计岩穗复杂的算法。
如果要想在程序设计领域走得更远,熟练运用编程语言仅仅是第一步,还需要有自己的主攻方向,并且能够围绕自己的主攻方向不断深入,掌握相应的研究方法,最终成长为一名研发级程序员。
.饿汉式单例类//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single = new Singleton1()
/羡则/静态工厂方法
public static Singleton1 getInstance() {
return single
}
}
2.懒汉式单例类
//懒汉式单例类.在第一次调用的时候实例化
public class Singleton2 {
//私有的默认构造子
private Singleton2() {}
//注意,这里没有final
private static Singleton2 single=null
//静态工厂方法
public synchronized static Singleton2 getInstance() {
if (single == null) {
single = new Singleton2()
}
return single
}
}
//对懒汉式单例的改进(错误的改进)
//实际上,只有在第一次创建对象的时候需要加锁,之后就不需要了 ,这样可以提升性能
public synchronized static Singleton2 getInstance() {
if (instance == null) {
synchronized(instance){ //锁住当前实例对象
if(instance == null){
instance = new Singleton2()
}
}
}
return instance
}
错误原因:
a>A、B线程同时进入了第一个老基if判断
b>A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton()
c>由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。
d>B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
e>此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
正确改进(侍派谨使用内部类):
JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,JVM能够帮我们保证instance只被创建一次,
并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心上面的问题。
同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题
public?class?Singleton?{??
??
/*?私有构造方法,防止被实例化?*/??
private?Singleton(){
}
/*?此处使用一个内部类来维护单例?*/??
private?static?class?SingletonFactory?{??
private?static?Singleton?instance?=?new?Singleton()??
}
/*?获取实例?*/??
public?static?Singleton?getInstance()?{??
return?SingletonFactory.instance??
}
/*?如果该对象被用于序列化,可以保证对象在序列化前后保持一致?*/??
public?Object?readResolve()?{??
return?getInstance()??
}
}
其实说它完美,也不一定,如果在构造函数中抛出异常,实例将永远得不到创建,也会出错????
第二种改进:
因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,
单独为创建加synchronized关键字,也是可以的
public class Singleton {
private static Singleton instance=null
private Singleton(){}
private static synchronized void Init(){
if(instance==null)
instance=new Singletion()
}
public static Singleton getInstance(){
if(instance==null){
Init()
}
return instance
}
}
3.登记式单例类
import java.util.HashMap
import java.util.Map
//登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3 {
private static Map<String,Singleton3>map = new HashMap<String,Singleton3>()
static{
Singleton3 single = new Singleton3()
map.put(single.getClass().getName(), single)
}
//保护的默认构造子
protected Singleton3(){}
//静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name) {
if(name == null) {
name = Singleton3.class.getName()
System.out.println("name == null"+"--->name="+name)
}
if(map.get(name) == null) {
try {
map.put(name, (Singleton3) Class.forName(name).newInstance())
} catch (InstantiationException e) {
e.printStackTrace()
} catch (IllegalAccessException e) {
e.printStackTrace()
} catch (ClassNotFoundException e) {
e.printStackTrace()
}
}
return map.get(name)
}
//一个示意性的商业方法
public String about() {
return "Hello, I am RegSingleton."
}
public static void main(String[] args) {
Singleton3 single3 = Singleton3.getInstance(null)
System.out.println(single3.about())
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)