As I believe I posted elsewhere on this site--I believe my kids learned generosity and to share easily precisely because they were not asked to share too early. A quick anecdote: My brother and sister-in-law had children the same age as mine, and they emphasized sharing all the time. When my eldest was about 4, he and one of his cousins were in the back of the car together, and his cousin said that he was thirsty. Owen grabbed his sippy cup and handed it to his cousin. My brother-in-law was astounded and asked what the secret was to getting my kids to share. I firmly believe it grew out of the process that he experienced at his daycare.
Both of my sons attended a daycare center from ages 1 to 4 that had a specific policy about "sharing." Their logic was that sharing requires the understanding that other people are different than oneself, and have thoughts, feelings, needs that are not the same as what the child him/herself is feeling. Sharing doesn't make any sense until you understand that other people are different from yourself, which leads to developing a sense of empathy. These concepts are actually part of a developmental process that children go through--usually during their infant/toddler/pre-school years. There is alot of scientific literature about this--see this article as an example).
Keeping in mind that all children develop at different rates and may or may not meet the listed milestones at the ages given, we can assume that your son is still pretty new to the concept of empathy and is still learning that if his tummy is happy with ice cream, doesn't necessarily mean that your tummy is also happy with ice cream. The approaches you are taking with your son are all based on his firmly understanding empathy--and he is probably still an "empathy beginner".
So, with all of this in mind, the way the daycare handled "sharing" situations was that if one child wanted a toy that one of my sons was playing with, a teacher would intercede by saying to my son, "Jake would like to play with that ball. How much longer would you like to play with it--two minutes or three minutes?" Once my son decided on a period of time, that time frame was adhered to rigorously. If my son needed a diaper change during the "waiting period" the toy was set aside for him because it was still "his time." I think the concept that this instilled in my children was that it was easy to share, because there was no sense of scarcity; i.e. they never thought "If I give this to someone else, I might never get it back again." Also, they clearly understood the rules, and trusted that they would work in their favor the next time they wanted something that someone else was playing with.
I know that your son is quite a bit older than my children were when they learned this skill, but I still think it can be implemented in his life. Try not to force him to share, but continue to model sharing behavior. If he is playing with friends and they start to argue about a toy, explain to them that you don't have enough of that toy for each of them, so rather than make one person feel sad that they don't have the toy, help the two of them find something that they can play with together and take away the toy that is causing the problem (it is likely to lead to some anger at the moment, but because it is enforced "fairly," in my experience that anger is likely to subside more quickly).
Continue to provide him with opportunities to understand that things that belong to him really are his to do with as he wishes. I think it is this concept of abundance (enough time with a toy, enough of a yummy food, enough of whatever to fulfill his wants) that allows children to offer to share their things with others.