1.线程同步就是指多个线程同时轮流抢占CPU资源,但可能会造成数据的错误
1)当某一个CPU资源为共享时,将其定义为static类型,类变量,全类都可以访问,为共享资源准备
2)当线程一起争夺CPU资源时,CPU资源被声明为static类时,线程里面的内容会因为线程的休眠被最后一个线程覆盖
3)线程同步可以解决这个问题,通过synchronized关键字修饰共享资源方法,相当于给在运行的线程上一把内置锁
只有当它运行完后,才会允许其他线程争夺之后循环这个操作
4 )线程同步还可以锁定代码块,就是线程们共享的资源,这个时候需要通过synchronized关键字锁住他们共处的类,并加上.class来标识
2.如何判断线程是同步还是不同步?
看他们锁定的资源时一份还是多份,一份就是同步,多份就是不同步
3.本质上,无论是锁定类还是方法,主要看他是不是独一无二的,也就是说看他是不是一份,例如类是一个,方法很多
方法是静态那么就独此一份,非静态就是多份
4.单例模式就是一个类只有一个对象
主要分三种情况
1)第一种:单线程的单例模式
创建一个类用于线程对共享资源的抢占,该类将对象声明私有,创建一个公共方法来创建对象
再创建一个测试类来创建实例对象
public class SingleThread1{
private static SingleThread singleThread;
public SingleThread(){
System.out.println("创建了SingleThread对象!");}
public static synchronized SingleThread getsingleThread(){
if(singleThread==null){
singleThread = new SingleThread();
}
return singlrThread;}
}
public class Test{
public static void main(String []args){
SingleThread singleThread = SingleThread.getsingleThread();
}
}
2)第二种:多线程的单例模式
测试类里面通过匿名类创建两个线程用于对共享资源类的竞争来体现单例
public class SingleThread1{
private static SingleThread singleThread;
public SingleThread(){
System.out.println("创建了SingleThread对象!");}
public static synchronized SingleThread getsingleThread(){
if(singleThread==null){
singleThread = new SingleThread();
}
return singlrThread;}
}
public class test1{
public static void main(String []args){
new Thread(new Runnable(){
@Override
public void run(){
SingleThread singleThread1 = SingleThread.getsingleThread();}
}).start();
new Thread(new Runnable(){
@Override
public void run(){
SingleThread singleThread2 = SingleThread.getsingleThread();}
}).start();
}
}
第三种锁定共享代码块,双层检测
无需将公共使用的整个方法都锁住,只需要锁住他们共享资源代码块也是一样的效果,而且这样更有效
public class SingleThread{
private static SingleThread singleThread;
public SingleThread(){
System.out.println("创建了SingleThread对象");
public static SingleThread getsingleThread(){
if(singleThread == null){
synchronized(SingleThread.class){
if(singleThread == null){
singleThread = new SingleThread();}
}
}
return singleThread;}}
}
public class test1{
public static void main(String []args){
new Thread(new Runnable(){
@Override
public void run(){
SingleThread singleThread1 = SingleThread.getsingleThread();}
}).start();
new Thread(new Runnable(){
@Override
public void run(){
SingleThread singleThread2 = SingleThread.getsingleThread();}
}).start();
}
}
总结:可能几天没有看java,有些东西有些忘咯,今天所学的知识还是有些没有捋清楚
线程同步。其实就是先判断共享资源是不是只此一份,如果是的话就是线程同步,如果不是的话就是不同步
如果是线程同步的话,会造成数据的错误,这个时候我们通过关键字synchronized来修饰这些“唯一”的共享资源
是他们顺序无误的完成任务,那他们如何唯一呢,第一个判断是否是static类型的,他是否是类,如果是的,那么就是唯一的
就是共享的
线程的单机模式
分三种情况:
第一种是单线程的单机模式,一个类一个对象独享共享资源
第二种多线程的单机模式,此时可以通过synchronized关键字来修饰他们所共享的资源,使他们各自单独完成任务
第三种多线程的单机模式详细,通过双层检测再结合synchronized关键字修饰代码块来完成数据的准确