java 代码块

java 代码块 在编程过程中我们可能会遇到如下这种形式的程序: public class Test { { //... } } 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法。一般来说代码块是不能单独运行的,它必须要有运行主体。在Java中代码块主要分为四种: 一、 普通代码块 普通代码块是我们用得最多的也是最普遍的,它就是在方法名后面用{}括起来的代码片段。普通代码块是不能够单独存在的,它必须要紧跟在方法名后面。同时也必须要使用方法名调用它。 public class Test { public void test(){ System.out.println(“普通代码块”); } } 二、 静态代码块 想到静态我们就会想到static,静态代码块就是用static修饰的用{}括起来的代码片段,它的主要目的就是对静态属性进行初始化。 public class Test { static{ System.out.println(“静态代码块”); } } 三、 同步代码块 使用 synchronized 关键字修饰,并使用"{}"括起来的代码片段,它表示同一时间只能有一个线程进入到该方法块中,是一种多线程保护机制。 四、 构造代码块 在类中直接定义没有任何修饰符、前缀、后缀的代码块即为构造代码块。我们明白一个类必须至少有一个构造函数,构造函数在生成对象时被调用。构造代码块和构造函数一样同样是在生成一个对象时被调用,那么构造代码在什么时候被调用?如何调用的呢?看如下代码: 复制代码 public class Test { /** 构造代码 */ { System.out.println(“执行构造代码块…”); } /** * 无参构造函数 */ public Test(){ System.out.println("执行无参构造函数..."); } /** * 有参构造函数 * @param id id */ public Test(String id){ System.out.println("执行有参构造函数..."); } } ...

2013-06-27 · 2 min · 215 words · -

符号引用 直接引用

符号引用 直接引用 符号引用(Symbolic References), 直接引用 https://blog.csdn.net/u014296316/article/details/83066436 https://www.zhihu.com/question/30300585 http://blog.csdn.net/imzoer/article/details/8086255 JVM在装载class文件的时候,会有一步是将符号引用解析为直接引用的过程。 那么这里的直接引用到底是什么呢? 对于指向"类型"【Class对象】、类变量、类方法的直接引用可能是指向方法区的本地指针。 指向实例变量、实例方法的直接引用都是偏移量。实例变量的直接引用可能是从对象的映像开始算起到这个实例变量位置的偏移量。实例方法的直接引用可能是方法表的偏移量。 在《深入Java虚拟机》书的第197页我们可以看到,子类中方法表的偏移量和父类中的方法表的偏移量是一致的。比如说父类中有一个say()方法的偏移量是7,那么子类中say方法的偏移量也是7。 书中第199页说,通过"接口引用"来调用一个方法,jvm必须搜索对象的类的方法表才能找到一个合适的方法。这是因为实现同一个接口的这些类中,不一定所有的接口中的方法在类方法区中的偏移量都是一样的。他们有可能会不一样。这样的话可能就要搜索方法表才能确认要调用的方法在哪里。 而通过"类引用"来调用一个方法的时候,直接通过偏移量就可以找到要调用的方法的位置了。【因为子类中的方法的偏移量跟父类中的偏移量是一致的】 所以,通过接口引用调用方法会比类引用慢一些。 下面介绍下什么是接口引用。 interface A{void say();} class B implements A{} class C{public static void main(String []s){A a=new B();a.say()}} 在上面的第三行代码中,就是用"接口引用"来调用方法。 符号引用: 符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。这样,对于其他类的符号引用必须给出类的全名。对于其他类的字段,必须给出类名、字段名以及字段描述符。对于其他类的方法的引用必须给出类名、方法名以及方法的描述符。

2013-06-24 · 1 min · 35 words · -

gorm

gorm db.Table("go_service_info").Select("go_service_info.serviceId as service_id, go_service_info.serviceName as service_name, go_system_info.systemId as system_id, go_system_info.systemName as system_name").Joins("left join go_system_info on go_service_info.systemId = go_system_info.systemId").Scan(&results) db.Table("table0"). Select("table0.field0, table0.field1"). Joins("join table1 on table0.field0=table1.field0"). Where("table0.field0=? and table1.field1=?", foo, bar). First(&obj) https://gorm.io/zh_CN/docs/index.html https://cloud.tencent.com/developer/article/1674450

2013-06-20 · 1 min · 34 words · -

Linux 数据恢复工具

Linux 数据恢复工具 Safecopy、TestDisk、PhotoRec

2013-06-15 · 1 min · 3 words · -

mariaDB

mariaDB 个向后兼容、替代MySQL的数据库服务器。它包含所有主要的开源存储引擎。 为何改了个名字呢,这其中是有些典故的。 MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。 MariaDB跟MySQL在绝大多数方面是兼容的,对于开发者来说,几乎感觉不到任何不同。目前MariaDB是发展最快的MySQL分支版本,新版本发布速度已经超过了Oracle官方的MySQL版本。 在Oracle控制下的MySQL开发,有两个主要问题: 1. MySQL核心开发团队是封闭的,完全没有Oracle之外的成员参加。很多高手即使有心做贡献,也没办法做到。2. MySQL新版本的发布速度,在Oracle收购Sun之后大为减缓。Widenius有一个ppt,用数据比较了收购之前和之后新版本的发布速度。有很多bugfix和新的feature,都没有及时加入到发布版本之中。 以上这两个问题,导致了各个大公司,都开发了自己定制的MySQL版本,包括Yahoo!/Facebook/Google/阿里巴巴+淘宝网等等。 MySQL是开源社区的资产,任何个人/组织都无权据为己有。为了依靠广大MySQL社区的力量来更快速的发展MySQL,另外开分支是必须的。 MariaDB默认的存储引擎是Maria,不是MyISAM。Aria可以支持事务,但是默认情况下没有打开事务支持,因为事务支持对性能会有影响。可以通过以下语句,转换为支持事务的Aria引擎。ALTER TABLEtablenameENGINE=MARIATRANSACTIONAL=1; MariaDB源代码公开存放于Launchpad项目托管平台,同时也提供了二进制和编译包供下载。MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX存储引擎。

2013-06-14 · 1 min · 22 words · -

How browsers work

How browsers work http://taligarsiel.com/Projects/howbrowserswork1.htm http://ux.sohu.com/topics/50972d9ae7de3e752e0081ff

2013-06-10 · 1 min · 5 words · -

java 线程, 中断, isInterrupted()

java 线程, 中断, isInterrupted() Thread.interrupted() Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。而 Thread.interrupt 的作用其实也不是中断线程,而是 通知线程应该中断了,具体到底中断还是继续运行,应该由被通知的线程自己处理。具体来说,当对一个线程,调用 interrupt() 时, ① 如果线程处于被阻塞状态 (例如处于 sleep, wait, join 等状态) , 那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。仅此而已。 ② 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行。也就是说,一个线程如果有被中断的需求,那么就可以这样做。 ① 在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。 ② 在调用阻塞方法时正确处理InterruptedException异常。 (例如,catch异常后就结束线程。) Thread thread = new Thread(() -> { while (!Thread.interrupted()) { // do more work. } }); thread.start(); // 一段时间以后 thread.interrupt(); 具体到你的问题,Thread.interrupted()清除标志位是为了下次继续检测标志位。如果一个线程被设置中断标志后,选择结束线程那么自然不存在下次的问题,而如果一个线程被设置中断标识后,进行了一些处理后选择继续进行任务,而且这个任务也是需要被中断的,那么当然需要清除标志位了。 中断的原理 Java中断模型也是这么简单,每个线程对象里都有一个boolean类型的标识 (不一定就要是Thread类的字段,实际上也的确不是,这几个方法最终都是通过native方法来完成的) ,代表着是否有中断请求 (该请求可以来自所有线程,包括被中断的线程本身) 。例如,当线程t1想中断线程t2,只需要在线程t1中将线程t2对象的中断标识置为true,然后线程2可以选择在合适的时候处理该中断请求,甚至可以不理会该请求,就像这个线程没有被中断一样。 java.lang.Thread类提供了几个方法来操作这个中断状态,这些方法包括: public static boolean interrupted 测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false (在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外) 。 public boolean isInterrupted() 测试线程是否已经中断。线程的中断状态不受该方法的影响。 ...

2013-06-03 · 3 min · 456 words · -

Java JUC Atomic

Java JUC Atomic Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。 在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新字段。Atomic包里的类基本都是使用Unsafe实现的包装类。 基本类: AtomicInteger、AtomicLong、AtomicBoolean; 引用类型: AtomicReference、AtomicReference的ABA实例、AtomicStampedRerence、AtomicMarkableReference; 数组类型: AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray 属性原子修改器 (Updater) : AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater 看到这么多类,你是否觉得很困惑,其实没什么,因为你只需要看懂一个,其余的方法和使用都是大同小异的,相关的类会介绍他们之间的区别在哪里,在使用中需要注意的地方即可。 在使用Atomic系列前,我们需要先知道一个东西就是Unsafe类,全名为: sun.misc.Unsafe,这个类包含了大量的对C代码的操作,包括很多直接内存分配以及原子操作的调用,而它之所以标记为非安全的,是告诉你这个里面大量的方法调用都会存在安全隐患,需要小心使用,否则会导致严重的后果,例如在通过unsafe分配内存的时候,如果自己指定某些区域可能会导致一些类似C++一样的指针越界到其他进程的问题,不过它的具体使用并不是本文的重点,本文重点是Atomic系列的内容大多会基于unsafe类中的以下几个本地方法来操作: public final native boolean compareAndSwapObject(Object obj,long Fieldoffset, Object expect, Object update); public final native boolean compareAndSwapInt(Object paramObject, long paramLong, int paramInt1, int paramInt2); 对象的引用进行对比后交换,交换成功返回true,交换失败返回false,这个交换过程完全是原子的,在CPU上计算完结果后,都会对比内存的结果是否还是原先的值,若不是,则认为不能替换,因为变量是volatile类型所以最终写入的数据会被其他线程看到,所以一个线程修改成功后,其他线程就发现自己修改失败了。 参数1: 被操作的对象 参数2: fieldoffset 被操作的域在对象中的偏移量,其实对比时是对比内存单元,所以需要属性的起始位置,而引用就是修改引用地址 (根据OS、VM位数和参数配置决定宽度一般是4-8个字节) ,int就是修改相关的4个字节,而long就是修改相关的8个字节。 获取偏移量也是通过unsafe的一个方法: objectFieldOffset(Fieldfield)来获取属性在对象中的偏移量;静态变量需要通过: staticFieldOffset(Field field)获取,调用的总方法是: fieldOffset(Fieldfield) 参数3: expect 域的期望值 参数4: update 域的更新值 对long的操作,要看VM是否支持对Long的CAS,因为有可能VM本身不支持,若不支持,此时运算会变成Lock方式,不过现在VM都基本是支持的而已。 public final native boolean compareAndSwapLong(Object paramObject, long paramLong1, long paramLong2, long paramLong3); ...

2013-06-03 · 6 min · 1152 words · -

排队自旋锁/Ticket Lock

排队自旋锁/Ticket Lock Ticket Lock 是为了解决自旋锁的公平性问题,类似于现实中银行柜台的排队叫号: 锁拥有一个服务号,表示正在服务的线程,还有一个排队号;每个线程尝试获取锁之前先拿一个排队号,然后不断轮询锁的当前服务号是否是自己的排队号,如果是,则表示自己拥有了锁,不是则继续轮询。 当线程释放锁时,将服务号加1,这样下一个线程看到这个变化,就退出自旋。 简单的实现 import java.util.concurrent.atomic.AtomicInteger; public class TicketLock { private AtomicInteger serviceNum = new AtomicInteger(); // 服务号 private AtomicInteger ticketNum = new AtomicInteger(); // 排队号 public int lock() { // 首先原子性地获得一个排队号 int myTicketNum = ticketNum.getAndIncrement(); // 只要当前服务号不是自己的就不断轮询 while (serviceNum.get() != myTicketNum) { } return myTicketNum; } public void unlock(int myTicket) { // 只有当前线程拥有者才能释放锁 int next = myTicket + 1; serviceNum.compareAndSet(myTicket, next); } } 缺点 ...

2013-06-03 · 1 min · 74 words · -

Strict-Workflow

Strict-Workflow A Chrome extension that helps you stay focused by blocking sites during work timers and letting you browse during break timers https://chrome.google.com/webstore/detail/cgmnfnmlficgeijcalkgnnkigkefkbhd

2013-06-02 · 1 min · 23 words · -

Spinlock(自旋锁), Ticket Spinlock, MCS Spinlock

Spinlock(自旋锁), Ticket Spinlock, MCS Spinlock 为什么要加锁 在 SMP 系统中,如果仅仅是需要串行地增加一个变量的值,那么使用原子操作的函数 (API) 就可以了。但现实中更多的场景并不会那么简单,比如需要将一个结构体A中的数据提取出来,然后格式化、解析,再添加到另一个结构体B中,这整个的过程都要求是「原子的」,也就是完成之前,不允许其他的代码来读/写这两个结构体中的任何一个。 这时,相对轻量级的原子操作API就无法满足这种应用场景的需求了, 我们需要一种更强的同步/互斥机制,那就是软件层面的「锁」的机制。 同步锁的「加锁」和「解锁」是放在一段代码的一前一后,成对出现的,这段代码被称为 Critical Section / Region (临界区) 。但锁保护的并不是这段代码本身,而是其中使用到的多核/多线程共享的变量,它「同步」(或者说串行化) 的是对这个变量的访问,通俗的语义就是“我有你就不能有,你有我就不会有”。 Linux中主要有两种同步锁,一种是 spinlock,一种是 mutex. spinlock 和 mutex 都既可以在用户进程中使用,也可以在内核中使用,它们的主要区别是: 前者不会导致睡眠和调度,属于 busy wait 形式的锁, 后者可能导致睡眠和调度,属于 sleep wait 形式的锁。 spinlock 是最基础的一种锁,像后面将要介绍的 rwlock(读写锁), seqlock(读写锁)等都是基于spinlock衍生出来的。就算是 mutex,它的实现与spinlock 也是密不可分。因此,本系列文章将首先围绕 spinlock展开介绍。 如何加锁 Linux 中 spinlock 机制发展到现在,其实现方式的大致有3种。 第一种实现 - 经典的 CAS 最古老的一种做法是: spinlock 用一个整形变量表示,其初始值为1,表示 available 的状态。当一个CPU (设为CPU A) 获得spinlock后,会将该变量的值设为0,之后其他CPU试图获取这个 spinlock 时,会一直等待,直到 CPU A 释放 spinlock, 并将该变量的值设为1。 那么其他的 CPU 是以何种形式等待的,如果有多个CPU一起等待,形成了竞争又该如何处理? 这里要用到经典的 CAS 操作 (Compare And Swap) 。 ...

2013-06-01 · 2 min · 330 words · -

display pdf in div

display pdf in div http://www.webdeveloper.com/forum/showthread.php?152923-PDF-within-a-DIV <object data="test.pdf" type="application/pdf" width="300" height="200"> alt : test.pdf </object>

2013-06-01 · 1 min · 14 words · -

POP3、SMTP、IMAP和Exchange

POP3, SMTP, IMAP 和 Exchange 当前常用的电子邮件协议有 SMTP、POP3、IMAP4, 它们都隶属于TCP/IP协议簇, 默认状态下, 分别通过 TCP 端口 25、110 和 143 建立连接 SMTP, Simple Mail Transfer Protocol SMTP 是一种提供可靠且有效电子邮件传输的应用层协议。SMTP 协议属于TCP/IP协议族, 主要用于传输系统之间的邮件信息并提供来信有关的通知。 SMTP 目前已是事实上的 E-Mail 传输的标准。 SMTP端口587 SMTP 即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器, 就可以把E-mail寄到收信人的服务器上了, 整个过程只要几分钟。 SMTP 服务器则是遵循 SMTP 协议的发送邮件的服务器, 用来发送或中转发出的电子邮件。 SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器, 这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。 SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP 重要特性之一是其能跨越网络传输邮件,即" SMTP 邮件中继"。通常,一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP传输层协议组成。使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。 在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统 (DNS) 的邮件交换服务器可以用来识别出传输邮件的下一条 IP 地址。 在传输文件过程中使用端口: 25 是因特网电子邮件系统首要的应用 层协议。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议一样,SMTP也存在两个 端: 在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。当一个邮件服务器从其他邮件服务器接收邮件消息时,它是作为SMTP服务器在运行。 ...

2013-05-20 · 1 min · 207 words · -

windows默认共享的打开和关闭?

windows默认共享的打开和关闭? http://www.cnblogs.com/Fooo/archive/2007/06/04/771021.html Windows启动时都会默认打开admin$ ipc$ 和每个盘符的共享,对于不必要的默认共享,一般都会把它取消掉,可当又需要打开此默认共享时,又该从哪里设置呢,一般来说有两个地方,MSDOS命令和计算机管理共享文件夹,下面主要从DOS命令来设置,因为比较简单,也可进行批处理。 一、因为Windows是默认打开默认共享的,还是先从删除默认共享开始吧: 首先从注册表里永久禁止打开默认共享: 如果要禁止C$、D$、E$一类的共享,可以单击"开始→运行"命令,在运行窗口键入"Regedit"后回车,打开注册表编辑器。依次展开[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters ]分支,将右侧窗口中的DOWRD值"AutoShareServer"设置为"0"即可。 如果要禁止ADMIN$共享,可以在同样的分支下,将右侧窗口中的DOWRD值"AutoShareWKs" 设置为"0"即可。 如果要禁止IPC$共享,可以在注册表编辑器中依次展开[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa]分支,将右侧窗口中的DOWRD值"restrictanonymous"设置值为"1"即可。 当不想改动注册表,或只是临时删除这些共享时,可以使用 net share 命令: 输入net share 命令时可以查看当前所有的共享 **net share c$ /del net share d$ /del net share ipc$ /del net share admin$ /del** 想每次开机后自动删除默认共享,只需把上面的命令保存为.bat文件,开机自动运行就可以了 二、打开默认共享: 先在控制面板的"服务",看SERVER服务是否启动,如果没有启动,则将设置为自动或者手动,然后再选择启动。 开启系统的默认共享的方法 1.检查AutoShareServer和AutoShareWks注册表值是否为0。 2.找到注册表中的HKEY_LOCAL_MACHINESystemCurrentControlSetServicesLanmanServerParameters。 3.将下面子项中的AutoShareServer和AutoShareWks DWORD值改为1。 4.重启。通常Win2003、Win2000XP会在启动时自动创建。 5.启动后,可以通过运行CMD命令进入命令行模式,再运行net share,再共享列表中会看到Admin$、C$IPC$等默认共享。 注意: 如果按以上方法仍无效。可能是病毒或恶意程序破坏了系统,这时因先杀毒和恢复系统。 此外关闭Server服务、在网卡上去掉Microsoft客户端驱以及在网卡上去掉"文件和打印共享"等都会关闭默认共享。此时要将相应项恢复设置。 也可以在开始菜单的运行中输入CMD,然后输入以下的命令 **net share c$=c: net share d$=d: net share ipc$ net share admin$** 在计算机管理中的共享文件中也可以对所有的共享目录进行设置,右键"我的电脑"->“管理”->“共享文件”,由于是图形界面比较简单,这里就不在详细说明。

2013-05-16 · 1 min · 63 words · -

AbstractQueuedSynchronizer, AQS

AbstractQueuedSynchronizer, AQS http://blog.zhangjikai.com/2017/04/15/%E3%80%90Java-%E5%B9%B6%E5%8F%91%E3%80%91%E8%AF%A6%E8%A7%A3-AbstractQueuedSynchronizer/ 队列同步器 AbstractQueuedSynchronizer (以下简称 AQS) ,是用来构建锁或者其他同步组件的基础框架。它使用一个 int 成员变量来表示同步状态,通过 CAS 操作对同步状态进行修改,确保状态的改变是安全的。通过内置的 FIFO (First In First Out) 队列来完成资源获取线程的排队工作。更多关于 Java 多线程的文章可以转到 这里 AQS 和 synchronized 在介绍 AQS 的使用之前,需要首先说明一点,AQS 同步和 synchronized 关键字同步 (以下简称 synchronized 同步) 是采用的两种不同的机制。首先看下 synchronized 同步,synchronized 关键字经过编译之后,会在同步块的前后分别形成 monitorenter 和 monitorexit 这两个字节码指令,这两个字节码需要关联到一个监视对象,当线程执行 monitorenter 指令时,需要首先获得获得监视对象的锁,这里监视对象锁就是进入同步块的凭证,只有获得了凭证才可以进入同步块,当线程离开同步块时,会执行 monitorexit 指令,释放对象锁。 在 AQS 同步中,使用一个 int 类型的变量 state 来表示当前同步块的状态。以独占式同步 (一次只能有一个线程进入同步块) 为例,state 的有效值有两个 0 和 1,其中 0 表示当前同步块中没有线程,1 表示同步块中已经有线程在执行。当线程要进入同步块时,需要首先判断 state 的值是否为 0,假设为 0,会尝试将 state 修改为 1,只有修改成功了之后,线程才可以进入同步块。注意上面提到的两个条件: state 为 0,证明当前同步块中没有线程在执行,所以当前线程可以尝试获得进入同步块的凭证,而这里的凭证就是是否成功将 state 修改为 1 (在 synchronized 同步中,我们说的凭证是对象锁,但是对象锁的最终实现是否和这种方式类似,没有找到相关的资料) ...

2013-05-15 · 17 min · 3619 words · -

Java 取当前类名, 方法名

Java 取当前类名, 方法名 http://blog.csdn.net/a578559967/article/details/7688971 public class ClassName { public static void main(String[] args) { testGetClassName(); } public static void testGetClassName() { // 方法1: 通过SecurityManager的保护方法getClassContext() String clazzName = new SecurityManager() { public String getClassName() { return getClassContext()[1].getName(); } }.getClassName(); System.out.println(clazzName); // 方法2: 通过Throwable的方法getStackTrace() String clazzName2 = new Throwable().getStackTrace()[1].getClassName(); System.out.println(clazzName2); // 方法3: 通过分析匿名类名称() String clazzName3 = new Object() { public String getClassName() { String clazzName = this.getClass().getName(); return clazzName.substring(0, clazzName.lastIndexOf('$')); } }.getClassName(); System.out.println(clazzName3); //方法4: 通过Thread的方法getStackTrace() String clazzName4 = Thread.currentThread().getStackTrace()[2].getClassName(); System.out.println(clazzName4); System.out.println(Thread.currentThread().getStackTrace()[0].getMethodName()); System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); System.out.println(Thread.currentThread().getStackTrace()[2].getMethodName()); } }

2013-05-13 · 1 min · 83 words · -

CanoKey

CanoKey https://docs.canokeys.org/ PIN - Personal Identification Number, 密码 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.61a12e8djeP2Yp&id=664914723920&_u=c2lc6g01b0f

2013-05-13 · 1 min · 9 words · -

debian postfix dovecot

debian postfix dovecot install postfix sudo apt-get install postfix internet site, wiloon.com; sudo dpkg-reconfigure postfix 4. 编辑main.cf emacs /etc/postfix/main.cf [/shel] 添加以下两行 home_mailbox = maildir/ 这个步骤其实为可选操作。mailbox类型可以是mbox或者是maildir,互有优缺点。但如果将来还打算扩展webmail这类应用,最好选为Maildir,这样兼容性更好一些。对于dovecot pop3而言,倒是无所谓了。具体mbox和maildir有什么区别,去参考《postfix权威指南》 mailbox_command = mydestination = wiloon.com,localhost.localdomain,localhost mydestination mydestination参数指定postfix接收邮件时收件人的域名,换句话说,也就是你的postfix系统要接收什么样的邮件。比如: 你的用户的邮件地址为user@domain.com, 也就是你的域为domain.com, 则你就需要接收所有收件人为user_name@domain.com的邮件。与myorigin一样,缺省地,postfix使用本地主机名作为 mydestination。如: 安装mailutils # apt-get install mailutils 创建用户user1 ```bash sudo useradd -m -s /bin/bash user1 sudo passwd user1 在mydestination后加上wiloon.com,成为这个样子: myhostname ...

2013-05-12 · 2 min · 373 words · -

nslookup

nslookup nslookup: name server lookup nslookup命令用于查询DNS记录,查看域名解析是否正常 nslookup 有两种模式: 交互 & 非交互,进入交互模式在命令行界面直接输入nslookup按回车,非交互模式则是后面跟上查询的域名或者IP地址按回车。一般来说,非交互模式适用于简单的单次查询,若需要多次查询,则交互模式更加适合,从根服务器进行迭代查询。 RR (Resource Records)————资源记录(RR)是包含了下列字段的4元组: (Name, Value, Type, TTL) 主机记录(A记录):RFC 1035 定义,A记录是用于名称解析的重要记录,提供标准的主机名到IP的地址映射。 别名记录(CNAME记录):RFC 1035 定义,向查询的主机提供主机名对应的规范主机名。 域名服务器记录(NS记录):用来指定该域名由哪个DNS服务器来进行解析。您注册域名时,总有默认的DNS服务器,每个注册的域名都是由一个DNS域名服务器来进行解析的,DNS服务器NS记录地址一般以以下的形式出现:ns1.domain.com、ns2.domain.com等。简单的说,NS记录返回域中主机IP地址的权威DNS服务器的主机名。 邮件交换记录(MX记录):返回别名为Name对应的邮件服务器的规范主机名。 https://www.cnblogs.com/even160941/p/14292059.html # nslookup –option1 –option2 host-to-find dns-server nslookup redis.wiloon.com 192.168.50.1 2.格式 nslookup [IP地址/域名] 3.应用实例 (1)在本地计算机上使用nslookup命令 $ nslookup Default Server: name.cao.com.cn Address: 192.168.1.9 在符号">“后面输入要查询的IP地址域名,并回车即可。如果要退出该命令,输入"exit”,并回车即可。 (2)使用nslookup命令测试named 输入下面命令: nslookup 然后就进入交换式nslookup环境。如果named正常启动,则nslookup会显示当前DNS服务器的地址和域名,否则表示named没能正常启动。 下面简单介绍一些基本的DNS诊断。 ◆检查正向DNS解析,在nslookup提示符下输入带域名的主机名,如hp712.my.com,nslookup应能显示该主机名对应的IP地址。如 果只输入hp712,nslookup会根据/etc/resolv.conf的定义,自动添加my.com域名,并回答对应的IP地址。 ◆检查反向DNS解析,在nslookup提示符下输入某个IP地址,如192.22.33.20,nslookup应能回答该IP地址所对应的主机名。 ◆检查MX邮件地址记录在nslookup提示符下输入: set q=mx 然后输入某个域名,输入my.com和mail.my.com,nslookup应能够回答对应的邮件服务器地址,即support.my.com和support2.my.com。 动手练习 1.危险的网络命令 互联网的发展使安全成为一个不能忽视的问题,finger、ftp、rcp和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,嗅探器可以非常容易地截获这些口令和数据。而且,这些服务程序的安全验证方式也是有弱点的,很容易受到"中间服务器"方式的攻击。这里笔者把一些不安全的命令根据危险等级列出,见表3所示。现在ftp、telnet可以被SSH命令代替绑定在端口22上,其连接采用协商方式,使用RSA加密。身份鉴别完成之后,后面的所有流量都使用IDEA进行加密。SSH(SecureShell)程序可以通过网络登录到远程主机,并执行命令。rcp、rlogin等远程调用命令也逐渐被VNC软件代替。 2.在一张网卡上绑定多个IP地址 在Linux下,可以使用ifconfig方便地绑定多个IP地址到一张网卡。例如,eth0接口的原有IP地址为192.168.0 .254,可以执行下面命令: ifconfig eth0:0 192.168.0.253 netmask 255.255.255.0 ...

2013-05-12 · 1 min · 166 words · -

Dovecot, 邮件服务器

Dovecot, 邮件服务器 dovecot 是一个开源的 IMAP 和 POP3 邮件服务器,支持 Linux/Unix 系统。 POP / IMAP 是 MUA 从邮件服务器中读取邮件时使用的协议。其中,与 POP3 是从邮件服务器中下载邮件比起来,IMAP4 则是将邮件留在服务器端直接对邮件进行管理、操作。而Dovecot 是一个比较新的软件,由 Timo Sirainen 开发,最初发布于 2002年7月。作者将安全性考虑在第一,所以 Dovecot 在安全性方面比较出众。另外,Dovecot 支持多种认证方式,所以在功能方面也比较符合一般的应用。 postfix (作为发送邮件服务器) +dovecot (作为接收邮件服务器) +MySQL (作为数据库) Dovecot是什么? 我们还是先跟随一个典型的从发送邮件到接收邮件的过程,借此来观察Dovecot起到了什么作用。 开始,某个人用邮件用户代理(MUA)创建了一封电子邮件,典型的MUA包括Mozilla Thunderbird和Microsoft Outlook Express。无论是用哪种MUA,邮件创建后被送到了该用户的邮件传输代理(MTA)——传送过程使用的是SMTP协议。然后MTA检查该邮件的收信人 (在这里我们假设是您) ,向DNS服务器查询接收方MTA对应的域名,然后将邮件发送至接收方MTA——使用的仍然是SMTP协议。这时,邮件已经从远程的用户工作站发送到了他的ISP的邮件服务器,并且转发到了您的域中。接下来会发生什么呢? 考虑到不同的网络配置,邮件在传输过程中很有可能被转移到另外一个MTA,但是最终会有某个MTA接管这封邮件,并且负责投递。这时,MTA会将邮件传递给某个邮件投递代理(MDA),MDA的主要作用就是将邮件保存到本地磁盘,有些MDA也可以完成其他功能,比如邮件过滤或将邮件直接投递到子文件夹。需要注意的是,完成将邮件存放在服务器上这个功能的是MDA。 现在,您该查收邮件了。运行MUA,您可以使用IMAP协议或POP3协议来向邮件服务器查询您的邮件。邮件服务器会先确认您的身份,然后从邮件存储区检索邮件列表,并将列表返回给MUA。现在您就可以阅读邮件了。现在我们就可以解释第一段了: 将邮件投递给您的邮件服务器就是Dovecot。 作为IMAP和POP3服务器,Dovecot为邮件用户代理(MUA)提供了一种访问服务器上存储的邮件的方法。但是,Dovecot并不负责从其他邮件服务器接收邮件。Dovecot只是将已经存储在邮件服务器上的邮件通过MUA显示出来。 IMAP和POP3是用于连接MUA与邮件存储服务器的两种常见的协议。POP3通常用于网络连接较慢的用户连接至邮件服务器。POP3的一条基本原则是,MUA从服务器上下载邮件并保存在本地磁盘上,然后将服务器上的邮件删除。IMAP通常用于局域网(LAN)或网络连接较快的用户,使用IMAP的目的就是只在每次有未读消息时才连接服务器 (而不是使用类似于MUA的缓存) 。Dovecot为使用IMAP协议的连接做了很多优化,这样IMAP客户端在连接Dovecot服务器时会表现出更好的性能。 Dovecot并不关心邮件的接收、投递和存储,这些功能都是由MTA (比如Postfix) 提供的。MTA决定邮件是如何存放的,以及存放在哪里,Dovecot必须根据MTA的配置来进行相应的配置。而且很明显的是,在安装Dovecot之前,必须保证MTA正常工作。 在*NIX环境下主要有两种邮件存储格式——mbox和Maildir。Mbox将大量的邮件——有时可以达到几千封——存放在一个文件中。Maildir则是将每封邮件都存放在单独的文件当中。可能由于文件系统较老等原因,您会选择使用mbox,但对于大多数的全新安装,Maildir提供了更强壮的存储实现和文件之间的相对平等。当然,还有一些其他的存储格式,比如dbmail,并不被Dovecot所支持 (至少现在不支持) 。 还需要重复一遍的是: Dovecot并不负责邮件的投递或存储,这两方面出现了问题应该考虑MTA或MDA是否正常工作。如果没有,知道该怎么办了吧? Dovecot的主要配置包括邮件存储类型,邮件存储位置,用户列表和密码列表。Dovecot以支持多种用户名/密码格式,包括*NIX密码、shadow、PAM、LDAP、SQL和vpopmail。通常,您应该选择一种邮件服务全局都可以接受的用户名/密码格式,其中包括您的MTA、MDA和Dovecot。

2013-05-10 · 1 min · 57 words · -