几种特殊的多线程函数

静态

如果同步函数被静态修饰后,使用的锁是什么呢?

通过验证,发现不是this

因为静态方法中不可以定义this

静态进内存时,内存中没有本类对象,但是一定有给类对应的字节码文件对象。

类名:class  该对象的类型时Class

class Ticket implements Runnable
{
	private int tick=100;
	public void run()
	{
		synchronized(Ticket.class)
		{
			while(true)
			{
				if(tick>0)
				{
				System.out.println("tick..."+tick--);
				}
			}
		}

	}
}
class StaticDemo
{
	public static void main(String[] args)
	{
		Ticket c=new Ticket();
		Thread  t1=new Thread(c);
		Thread  t2=new Thread(c);
		t1.start();
		t2.start();
	}
}

单例设计模式

饿汉式

class Single
{
	private static  Single s= null;
	private Single(){}
	public static Single getInstance()
	{
		if(s==null)
			s=new Single();
		return s;
	}
}

这个不会出现安全问题;

懒汉式

class Single
{
	private static  Single s= null;
	private Single(){}
	public static Single getInstance()
	{
		if(s==null)
			s=new Single();
		return s;
	}
}

当有多线程时,在调用的方法中出现多条语句 ,就有可能出现安全问题

解决

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;
			}
		}
	}
}

面试时注意

懒汉式与饿汉式有什么不同?

懒汉式特点在于延迟加载;

懒汉式在延迟加载时有没有问题?怎么解决?

有,在多线程访问时会出现安全问题;

可以加同步解决,用同步函数与同步代码块都可以,但是效率低效;所以我们用双重判断来解决效率问题;

加同步是用的锁是给类所属的字节码文件对象;

一般面试都会问

请写一个延迟加载的单例设计模式示例;

这时一定要写加同步的代码;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 14:54:12

几种特殊的多线程函数的相关文章

unity中三种调用其他脚本函数的方法

第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 unity中三种调用其他脚本函数的

javascript继承—prototype最优两种继承(空函数和循环拷贝)(3) - jssl915

一.利用空函数实现继承 参考了文章javascript继承-prototype属性介绍(2) 中叶小钗的评论指点,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权属性和特权方法,私有属性,私有方法的空耗资源问题. function Person(name,age){ this.name = name; this.age = age; } Person.prototype = { constructor:Person, sayHi:function(){

iOS中有3种常见的多线程编程方法

1.NSThread 这种方法需要管理线程的生命周期.同步.加锁问题,会导致一定的性能开销 2.NSOperation和NSOperationQueue 是基于OC实现的.NSOperation以面向对象的方式封装了需要执行的操作,然后可以将这个操作放到一个NSOperationQueue中去异步执行.不必关心线程管理.同步等问题. 3.Grand Centeral Dispatch 简称GCD,iOS4才开始支持,是纯C语言的API.自iPad2开始,苹果设备开始有了双核CPU,为了充分利用这

epoll函数及三种I/O复用函数的对比

epoll函数 #include <sys/epoll.h>int epoll_create(int size)int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout) Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数

brew - 可以简单的获取数千种开源工具和函数库的包管理器

一.简介 brew是一个使用ruby语言.由非营利组织开发的包管理工具. Homebrew程序提供的brew,严格来讲不是一个OS X的原生命令,但任何一个OS X的专业用户都不会错过它. "OS X缺少的包管理器"这个评价是恰如其分的. 如果你曾经在Linux上使用过apt-get,你就会发现Homebrew基本上是一样的. 使用brew可以简单的获取数千种开源工具和函数库. 例如: brew install imagemagick就可以安装ImageMagick, brew ins

JavaScript两种方法来定义一个函数

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /*I总结: 1.函数名能够做变量使用.能够赋值.能够传值 2.函数名当參数.传递给还有一个函数 */ //==================js中

详解三种java实现多线程的方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class thread1 extends Thread {    public void run() {        for (int i = 0; i < 10000; i++) {            System.out.println("我是线程"+

用三种方法实现strlen函数

实现strlen函数有三种方法: 一.计数器的方法 二.递归的方法 三.指针减指针的方法 下面是三种方法的实现: 计数器的方法: int my_strlen(const char *str){ assert(str);    //对指向字符串指针的断言 int count = 0; while (*str) {  count++;  str++; } return count;} 递归的方法: int my_strlen(const char *str){ assert(str); if (*s

函数——函数的两种声明方式:函数声明&amp;函数表达式的区别(未完待续。。。)

一.函数声明中函数名是必须的:函数表达式中则是可选的 //函数声明 function sum(a, b) { return a + b; } alert(sum(1, 2)); //函数表达式 /* var s = function sum(a, b) { return a + b; } alert(s(1, 2)); */ var s = function(a, b) { return a + b; } alert(s(1, 2)); //以上两种都可以 二.用函数声明定义的函数,函数可以在函