synchronized

一 简介

在java1.5之前, java程序员在多线程开发的时候,能够用来进行并发控制的手段并不多: synchronized关键字. 虽然自1.5之后java提供了更多的并发控制方式,比如可重入锁,自旋锁等,但是synchronized关键字因为它的简单(粗暴),使用的频率还是非常高.

二 使用方式

synchronized关键字主要有两种使用方式:

1)修饰方法.这样可以使其修饰的方法称为一个线程安全的方法.

2)修饰对象.synchronized修饰对象时,可以构造一个语句块,在这个语句块里的所有语句都是线程安全的.

对于第二种情况,即当synchronized关键字修饰对象的时候,有以下两点要注意:

1)synchronized不能修饰java的8中基本数据类型:boolean,byte,char,short,int,long,float,double.否则会导致编译错误. 需要说明的是, 这8类基本数据类型的封装类是可以被synchronized关键字修饰的.

2)synchronized也不能修饰引用为null的对象.否则在运行的时候会抛出NullPointException.

当synchronized修饰基本数据类型时,发生编译错误:

当synchronized修饰引用为null的对象时,程序运行过程中会从synchronized关键字所在位置抛出NullPointException:

三 底层机制

虽然说对普通的开发者来说,只需要从功能角度和层面掌握synchronized的主要功能和基本用法,但是如果要对java理解的更加深刻的话,就得理解synchronized背后的机制了.

我自己在很长一段时间都认为,synchronized关键字在修饰方法的时候和方法内部的synchronized的同步块是没有什么差别的,我总是这样理解:

认为

class SynDemo {
	public synchronized void fun(){
		System.out.println("hello");
	}
}

class SynDemo {
	public void fun() {
		synchronized (this) {
			System.out.println("hello");
		}
	}
}

本质上是一样的.

class SynDemo {
	public synchronized static void fun() {
		System.out.println("hello");
	}
}

class SynDemo {
	public void fun() {
		synchronized (SynDemo.class) {
			System.out.println("hello");
		}
	}
}

本质上也是一样的.

虽然在功能上可以这样理解,但本质上不是.如果深入到java虚拟机指令的层次,很容易就能发现这一点.

synchronized在修饰方法的时候其实对应虚拟机指令的的方法描述符: ACC_SYNCHRONIZED, 而sysnchronized同步块对应的虚拟机指令是monitorenter和moniterexit,他们分别表示进入和退出同步区域(临界区)

四 虚拟机指令: ACC_SYNCHRONIZED

待补充

五 虚拟机指令: monitorenter和moniterexit

待补充

如何选择

一 选择

选择的内核其实是分析

二 如何选择

如何做选择,其实是如何分析.分析是方法,就得结合具体的问题,在实际场景中运用了,没有通用的法则.但是,认识到选择与分析的联系至少具有这样的意义: 它使我们认识到,当我们面临困难的选择的时候,我们不应该迷茫和不知所措,也不该由自己一时的心情或情绪左右自己的理智,以免做出冲动的,甚至让自己后悔终生的选择,我们唯一正确的做法就是分析.

虽然分析没有万能的法则,但依然有规律可循,下面几个问题,我们在做选择的时候,几乎都需要考虑.

1)我的能力

喝过了太多鸡汤的人都知道,当今社会都是弘扬努力奋斗,人定胜天的精神.虽然说积极乐观总是好的,但是现在的各种消息面传达出来的信息,客观的讲,确实太夸张了.有的把人的能力夸张到领人吃惊的地步,仿佛一个人的能力就是无穷的一样,这种现象在各种励志故事和成功人士的报道中尤其常见.长期侵染在这种环境和氛围中的我们是非常危险的,因为我们经常意识不到一个真理: 人的能力是有限的.一个简单的数学公式就能反映这一点: 工作量=时间x效率. 如果说人的效率不太好考究的话(但是肯定是有限的), 那么人的寿命是有限的,这在当前就是铁的事实!

意识到自己的能力有限,至少在做选择的时候会变得理性.

你有多少时间? 很简单, 用天数乘以24就是你最多的可用时间,但正常还得每天减8个小时. 根据这个算法就能很容易算出自己的可支配时间. 效率虽然不如时间的算法简单,但其实也很好估算:根据自己的历史数据.对自己以前的做事效率进行简单的总结就能了解自己大概的效率了.比如:

1)平时看完一本书大概需要几个小时?

2)完成一件工作大概花了几天?

如果再对选项中的各种任务,结合自己的历史做一个评估那就会更加准确了.经验和历史的意义就在于此,可以给未来以参考.

2)我的期望

期望其实也是左右选择的很重要的因素.我认为在做选择的时候,应该克制感性,保持理性,显然期望并不是客观和理性的因素,所以总的来说我是赞同认清能力,克制期望.但在有些情况下,期望又可以看成是理性的因素,因为一个人的期望会影响一个人的能力.

线程安全

一 线程安全的定义

线程安全的书面定义常常是: 多个线程访问同一段代码,不会产生不确定的结果.

这种定义是从结果的角度来判断.这种定义方式比较数学化(集合味道),具有普适性,但是很抽象.因为程序员更喜欢一种直观,场景化,准则性和指导性的东西.

比如程序员更喜欢下面这些:

1)如果是单线程环境,一定是线程安全的

2)如果线程之间没有共享资源,一定是线程安全的

3)如果资源是只读的,就一定是线程安全的.

4)如果对资源加锁,就一定是线程安全的.

……

有了这些场景化的具体描述,程序员就可以根据这些条件,去判断自己的代码是否线程安全.

二 具体化

其实线程安全归根结底,线程安全涉及两个方面:多个线程和共享资源.这既是引起线程安全问题的两个必要条件,也是线程安全问题反映到的两个具体对象.

保证线程安全可以从这两个方面着手,而检查多线程问题同样也可要从这两个对象来入手,加上访问类型,来看线程安全问题:

1)对共享资源的访问方式包括两种基本操作: 读和写.

2)共享资源本身: 如果多个线程同时访问共享资源,会不会对资源本身的结构造成破坏,这其实是要确保资源的完整性[更新动作不是原子性的].

3)各个线程本身: 如果多个线程同时访问共享资源,每个线程的计算结果是否正确[和计算结果的业务含义有关].

关于自控力

一 自控力的地位

1.自控力是取得成功的最基础,最核心,最重要的能力。

2.有了自控力,你就能去到任何你想去的地方。
3.研究自控力,增强自控力无比重要,也许这件事情就是你目前最重要的事情。

4.在获得足够的自控力之前,任何关于成功的书籍都没有阅读的价值。不管作者是卡耐基,还是曾国藩。

二 自控力个人经验

1.任何时刻,只有一件事情要做!注意:没有什么最重要的事情,就只有一件事情!——尽量缩短自己做选择的时间,甚至几乎不做选择,最极端(最好)的做法就是:抛硬币。


三 生理学机制

1.多巴胺

2.突触

3.阿尔维德·卡尔森, 保罗·格林加德, 埃里克·坎德尔

db link

创建db link的SQL:

create base link dblink1 connnect to <用户名> identified by <密码> using <本地配置的数据库实例名>

查询表:

select * from <表名>@<db link名>

使用注意:

连接数问题

JFrame类图结构

jdk版本: 1.6

WindowConstants: 定义了窗口关闭的行为,setDefaultCloseOperation(int), getDefaultCloseOperation()

TransferHandler.HasGetTransferHandler: 与文本的复制,剪切,粘贴以及拖放(Drag and Drop)相关

RootPaneContainer: 与java的swing框架的版面结构相关(RootPane,GlassPane,LayeredPane,ContentPane)