|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
线程安全问题就是是 多个线程访问同一个 共享资源 ,如果多个线程不同步数据的话,会出现问题,可以用 synchronized(对象)同步数据维护数据。synchronized机制是给共享资源上锁,在执行之前要拿到同步对象的锁(一个对象一把锁)才可以执行同步的内容,在执行过程中不会被其他线程参与进来,同步代码在同一刻只执行一个线程,而且也同步了共享资源,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的,线程执行完就把锁还给对象了,也就是执行同步代码前拿到锁,执行时锁锁住了,其他线程参与不进来,执行完就还给对象锁。
同步代码格式:
synchronized(对象) { 需要同步的代码; }
同步函数格式:
修饰符 synchronized void 函数名{
}
同步的前提: 
同步需要两个或者两个以上的线程。 
多个线程共享同一个数据的时候使用的是同一个锁(有多个线程 共享数据的时候要共享同一个对象 ,如果都是同步代码synchronized(对象),填的对象一样,如果有同步代码和同步函数 同步函数同步的是什么对象 同步代码synchronized(对象)就写哪个对象)
举例子:
在同步函数中。函数都会被一个对象调用,那那个对象就是this,同步韩苏护的锁就是this,在一个类里有同步代码同步函数,既然函数的对象是this,锁是this ,同步代码就写this
在静态函数中,锁是class对象,静态内存是,内存中没有本类对象,但是一定有改类对应的字节码文件对象 也就是写 本类名。Class
单例设计模式-饿汉式和懒汉式
饿汉式:
Class Single
{
private static final single s=new single();
private Single(){}
public static Single getInstance(){
return s;
}
}
懒汉式:
- public static void main(String[] args) {
- System.out.println("Hello World");
- }
- }
- class Single
- { private static Single s=null;
- private Single(){}
- public static Single getInstance(){
- if(s==null)
- s=new Single();
- return s;
- }
- }
-
复制代码
懒汉式和饿汉式有什么不同:
懒汉式是用于延迟加载
但在多线程中懒汉式会有安全性 解决方法就是同步 同步的话可以解决这个问题
但是会稍微有点低效 因为其他线程进来后先同步 ,可以用双重判断 加同步的时候锁是该类所属的字节码对象
解决后:
- public static void main(String[] args) {
- System.out.println("Hello World");
- }
- }
- class Single
- {
- private static Single s=null;
- private Single(){}
- public static Single getInstance(){
- if (s==null)
- {
- synchronized(Single.class)
- {
- if(s==null)
- s=new Single();
- }
- }
- return s;
- }
复制代码
死锁:
- package UI;
-
- import java.lang.Thread;
-
- public class sport {
- public static void main(String[] args) {
-
- Ticket a=new Ticket();
- Ticket b=new Ticket();
- Thread b1 =new Thread(a);
- Thread b2 =new Thread(a);
- b1.start();
- try { Thread.sleep(10);} catch (Exception e){};
- a.flag=false;
- b2.start();
- }
-
- }
- class Ticket implements Runnable
- {
- private int ticket=100;
- boolean flag =true;
- Object obj =new Object();
- public void run(){
- if(flag){
- while(true){
- synchronized(obj){//把这里obj 改成this
- show();//调用的show的是this的锁
- }
- }
- }
- else
- while(true)
- show();
- }
- public synchronized void show(){//this
- synchronized(obj){//这里也改为this
- if(ticket>0){
- try { Thread.sleep(10);} catch (Exception e){};
- System.out.println(Thread.currentThread().getName()+"…sale:"+ticket--);
- }
- }
- }
- }
-
复制代码
结果是 程序会挂着 执行不完
死锁:
同步中嵌套同步 同步不同
上面例子有两重锁 ,锁都是不同对象的,那就同步不了数据 ,那就是死锁了
|
评分
-
查看全部评分
|